Ruby C API字符串和符号相等?

时间:2014-03-30 02:04:13

标签: c ruby ruby-c-extension

为Ruby gem编写C扩展,我需要测试参数值是否与已知符号和字符串相等。

我意识到你可以用

实习一个字符串
char *foo = "foo";
VALUE foo_string_value = rb_intern(foo);

然后将其转换为符号:

VALUE foo_sym_value = ID2SYM(foo_string_value);

我的问题是我现在能否可靠地测试参数,可能是符号或字符串,:foo'foo',这些参数使用C指针相等:

if (param == foo_string_value || param == foo_sym_value) {
  ...
}

换句话说,实习是否保证指针相等也是符号和字符串的值相等?

如果这是错误的方法,那么进行此比较的对象是什么?

1 个答案:

答案 0 :(得分:3)

我想出来了。做我想要的合理方式似乎是

VALUE square_sym = ID2SYM(rb_intern("square"));
VALUE kind_as_sym = rb_funcall(kind_value, rb_intern("to_sym"), 0);
if (square_sym == kind_as_sym) {
  ...
}

符号始终是实体并且具有唯一值。字符串不是也不是。可以实现它们以获取每个字符串唯一的整数ID,但在这种情况下这没有帮助。