Как заморозить ссылку на Ruby? - PullRequest
4 голосов
/ 18 июля 2010

Я использую 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 ]

3 голосов
/ 18 июля 2010

Вы должны использовать функцию 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);
}

Затем, когда вы пытаетесь сделать это из ruby:

$var = 123

вы получите ошибку.

NameError: $var is a read-only variable
3 голосов
/ 18 июля 2010

Нет способа сделать это.Если переменная является константой (начинается с заглавной буквы), вы увидите предупреждение, если попытаетесь переназначить ее, но переназначение все равно будет иметь местонапример,

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