2014-03-30 8 views
4

Ruby gem에 C 확장을 쓰면 알려진 기호와 문자열과 동일한지 매개 변수 값을 테스트해야합니다.Ruby C API 문자열과 기호가 동일합니까?

나는 당신이 수련 할 수 실현 다음

char *foo = "foo"; 
VALUE foo_string_value = rb_intern(foo); 

및 심볼로 변환 된 문자열 :

VALUE foo_sym_value = ID2SYM(foo_string_value); 

내 문제는 내가 지금 안정적으로 될 수있는 매개 변수를 테스트 할 수 있는지 여부입니다 기호 또는 문자열, :foo 또는 'foo', C 포인터 동일성을 사용하는 이들과 함께 :

if (param == foo_string_value || param == foo_sym_value) { 
    ... 
} 

다른 말로하면, 포인터 평등성이 심볼과 문자열에 대한 값 평등이라는 보장은 있습니까?

이것이 잘못된 접근이라면이 비교를 수행 할 수있는 올바른 방법은 무엇입니까?

답변

3

나는 이것을 알아 냈다. 내가 원하는 것을하기위한 합당한 방법은 다음과 같습니다.

VALUE square_sym = ID2SYM(rb_intern("square")); 
VALUE kind_as_sym = rb_funcall(kind_value, rb_intern("to_sym"), 0); 
if (square_sym == kind_as_sym) { 
    ... 
} 

기호는 항상 내부적이며 고유 한 값을가집니다. 문자열은 그렇지 않습니다. 각 문자열에 대해 고유 한 정수인 ID을 가져올 수는 있지만이 경우에는 도움이되지 않습니다.