2010-07-17 27 views
4

我使用Object#freeze來凍結對象的值。我可以編寫一個函數來深化複雜的對象結構。但是這兩者都不會阻止我爲對象分配新的值。如何凍結Ruby引用?

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

在C我說

int const * const ptr = argv; 

我如何能徹底凍結的標識?

回答

3

沒有辦法做到這一點。如果一個變量是一個常量(以大寫字母開頭),那麼如果您嘗試重新分配變量但仍會發生重新分配,您將看到警告。例如

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> 
3

您必須使用rb_define_readonly_variable功能從C擴展名,例如:

VALUE var; 

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

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

然後,當您嘗試從紅寶石做到這一點:

$var = 123 

你會得到一個錯誤。

NameError: $var is a read-only variable