如何冻结Ruby引用?
我使用如何冻结Ruby引用?,ruby,freeze,Ruby,Freeze,我使用Object#freeze冻结对象的值。我可以写一个函数来深度冻结一个复杂的对象结构。但这两者都不会阻止我为对象指定新值 $O=cl() $O.thorough_freeze $O[:file] = "makefile" # => TypeError $O[:commands][0] = "clean" # => TypeError $O = "reticulate" # => TypeError 用C我说 int const * con
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;
如何彻底冻结标识符?没有办法做到这一点。如果变量是常量(以大写字母开头),则如果尝试重新分配它,但仍会发生重新分配,则会看到警告。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>
irb(main):008:0>MyConst=my_obj
=> #
irb(main):009:0>MyConst=my_other
(irb):9:警告:已初始化常量MyConst
=> #
您必须使用C扩展名中的rb\u define\u readonly\u变量
函数,例如:
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