2014-03-30 19 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) { 
    ... 
} 

符號總是interned和具有唯一值。字符串不是,也不是。他們可以實習得到ID,它們是每個字符串唯一的整數,但在這種情況下不起作用。