3

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

これはなぜですか?期待される動作を実現するには、コードをどのように変更する必要がありますか?

4

1 に答える 1

5

あなたの例では同じことを比較していません。

rb_internを返しますIDが、直接比較していVALUEます。最初に を「アンラップ」して、関連付けられている をVALUE取得する必要があります。IDこれでステートメントを置き換えるとif、問題が解決するはずです。

if (rb_intern("test") == SYM2ID(symbol)) {
    ...
于 2012-07-28T22:00:23.487 に答える