質問

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)) {
    ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top