如何冻结Ruby引用?

时间:2010-07-17 21:43:40

标签: ruby freeze

我使用Object#freeze来冻结对象的值。我可以编写一个函数来深度冻结复杂的对象结构。但两者都不会阻止我为对象分配新值。

$O=cl()
$O.thorough_freeze
$O[:file] = "makefile"      # => TypeError
$O[:commands][0] = "clean"  # => TypeError
$O = "reticulate"           # => TypeError

在C中我说

int const * const ptr = argv;

如何彻底冻结标识符?

2 个答案:

答案 0 :(得分:3)

没有办法做到这一点。如果变量是常量(以大写字母开头),那么如果您尝试重新分配变量,则会看到警告,但仍会进行重新分配。 e.g。

irb(main):008:0> MyConst = my_obj
=> #<MyClass:0x2b8a66c>
irb(main):009:0> MyConst = my_other
(irb):9: warning: already initialized constant MyConst
=> #<MyClass:0x2b854b4>

答案 1 :(得分:3)

您必须使用C扩展中的rb_define_readonly_variable函数,例如:

VALUE var;

void Init_my_extension(void) {
  var = Qnil; // set this to the initial value.

  rb_define_readonly_variable("$var", &var);
}

然后,当您尝试从ruby执行此操作时:

$var = 123

你会收到错误。

NameError: $var is a read-only variable