Ruby C API を使用したシンボルの等価性のテスト
-
13-12-2019 - |
質問
Ruby C API でシンボルの等価性をテストする方法を見つけようとしています。次の C 関数について考えてみましょう。
static VALUE test_symbol_equality(VALUE self, VALUE symbol) {
if (rb_intern("test") == symbol) {
return Qtrue;
} else {
return Qfalse;
}
}
Ruby の観点から見ると、このメソッドは期待どおりに動作しません。
test_symbol_equality(:test) # => false
なぜそうなるのでしょうか?期待される動作を実現するにはコードをどのように変更する必要がありますか?
解決
あなたの例では同じものを比較していません。
rb_intern
を返します ID
, 、しかしあなたはそれをと比較しています VALUE
直接。まず「アンラップ」する必要があります VALUE
, を取得して、 ID
と関連付けられています。交換する if
これによるステートメントは問題を解決するはずです:
if (rb_intern("test") == SYM2ID(symbol)) {
...
所属していません StackOverflow