2012-07-28 50 views
3

我正試圖找到一種方法來測試Ruby C API中的符號相等性。考慮下面的C函數:使用Ruby C API測試符號的相等性

static VALUE test_symbol_equality(VALUE self, VALUE symbol) { 
    if (rb_intern("test") == symbol) { 
    return Qtrue; 
    } else { 
    return Qfalse; 
    } 
} 

從視紅寶石點,預期這種方法並不表現:

test_symbol_equality(:test) # => false 

爲什麼會出現這種情況?我如何需要更改代碼以實現預期的行爲?

回答

5

你沒有在你的例子中比較相同的東西。

rb_intern返回ID,但您直接將其與VALUE進行比較。您首先必須「拆開」VALUE,檢索它與之相關的ID。用此代替if聲明應解決您的問題:

if (rb_intern("test") == SYM2ID(symbol)) { 
    ...