我使用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;
如何彻底冻结标识符?
答案 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