2010-07-17 6 views
4

나는 Object#freeze을 사용하여 개체의 값을 고정시킵니다. 복잡한 객체 구조를 완전히 동결시키는 함수를 작성할 수 있습니다. 하지만 어느 것도 객체에 새로운 값을 할당 할 수 없습니다.Ruby 참조를 고정하려면 어떻게합니까?

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

나는

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

당신은 예를 들어, C 확장에서 rb_define_readonly_variable 기능을 사용할 수 있습니다

$var = 123 

당신이 얻을 것이다 : 당신은 루비에서이 작업을 수행 할 때, 그리고

VALUE var; 

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

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

오류.

NameError: $var is a read-only variable 
관련 문제