代码之家  ›  专栏  ›  技术社区  ›  wilhelmtell

如何冻结Ruby引用?

  •  4
  • wilhelmtell  · 技术社区  · 14 年前

    我用 Object#freeze 冻结对象的值。我可以写一个函数来深度冻结一个复杂的对象结构。但这两者都不能阻止我给一个对象赋值。

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

    int const * const ptr = argv;
    

    如何才能完全冻结标识符?

    2 回复  |  直到 14 年前
        1
  •  3
  •   mikej heading_to_tahiti    14 年前

    没有办法做到这一点。如果变量是一个常量(以大写字母开头),那么如果您尝试重新分配它,但仍将进行重新分配,则会看到警告。例如

    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>
    
        2
  •  3
  •   Adrian    14 年前

    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