代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

在Ruby中重新分配常量时引发异常?

  •  5
  • Benjamin Oakes  · 技术社区  · 14 年前

    真正地 不变。与其他编程语言一样,对对象的引用是存储在变量/常量中的唯一内容(侧边栏:Ruby确实有“冻结”被修改的引用对象的功能,据我所知,这在许多其他语言中都不是一种功能。)

    所以我的问题是:当你把一个值赋给一个常数,你会得到这样的警告:

    >> FOO = 'bar'
    => "bar"
    >> FOO = 'baz'
    (irb):2: warning: already initialized constant FOO
    => "baz"
    

    3 回复  |  直到 14 年前
        1
  •  5
  •   brian d foy    6 年前

    Can you ask ruby to treat warnings as errors? 了解在某些情况下如何将警告视为错误。

    否则,我猜您必须编写一个自定义方法来分配常量,如果已经分配了,则引发异常。

    如果知道某个特定常量发生了重新分配,还可以在分配之前添加健全性检查。

        2
  •  3
  •   Marc-André Lafortune    14 年前

    你不能直接拦截它,不。

    如果你 如果我需要这么做,我可以想出一个非常肮脏的黑客,虽然。您可以将标准错误IO重定向到自定义IO对象。这个 write 方法可以检查正在编写的内容;如果它包含 "warning: already initialized constant" ,然后进行提升,否则将调用转发到标准错误的 .

        3
  •  1
  •   Andrew Grimm atk    12 年前

    如果常量在类或模块中,则可以 freeze 类或模块:

    # Normal scenario
    $VERBOSE = true
    class Foo
      BAR = 1
    end
    
    Foo::BAR = 2 # warning: already initialized constant BAR
    # Using freeze
    Foo.freeze
    Foo::BAR = 3
    RuntimeError: can't modify frozen Class
        from (irb):8
        from /Users/agrimm/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
    

    对于你的场景,你可以冻结 Object