使用Ruby C API测试符号的相等性

use*_*029 3 c ruby ruby-c-extension

我试图找到一种方法来测试Ruby C API中的符号相等性.考虑以下C函数:

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

从Ruby的角度来看,此方法的行为不符合预期:

test_symbol_equality(:test)    # => false
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我如何更改代码以实现预期的行为?

emb*_*oss 5

你没有在你的例子中比较同样的事情.

rb_intern返回一个ID,但是你将它与VALUE直接比较.你首先必须"解开" VALUE,检索ID它与之相关联.if用这个替换你的陈述应该可以解决你的问题:

if (rb_intern("test") == SYM2ID(symbol)) {
    ...
Run Code Online (Sandbox Code Playgroud)