【问题标题】:Ruby C API string and symbol equality?Ruby C API字符串和符号相等?
【发布时间】:2014-03-30 02:04:12
【问题描述】:

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

我知道你可以用

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

然后将其转换为符号:

VALUE foo_sym_value = ID2SYM(foo_string_value);

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

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

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

如果这是错误的方法,那么进行这种比较的正确方法是什么?

【问题讨论】:

    标签: c ruby ruby-c-extension


    【解决方案1】:

    我想通了。做我想做的事的合理方法似乎是

    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) {
      ...
    }
    

    符号始终是固定的并且具有唯一的值。字符串不是,也不是。他们可以被实习来获得IDs,它们是每个字符串唯一的整数,但这在这种情况下没有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多