我怎样才能覆盖这个Ruby变量?

Bla*_*man 2 ruby ruby-on-rails

原始代码如下所示:

module Acme
  class Address
    STREET_NAME = "123 acme inc drive".freeze

    ..
    ..
  end
end
Run Code Online (Sandbox Code Playgroud)

这是第三方宝石,我希望我能STREET_NAME以某种方式修改初始化程序中的变量,而无需编辑源代码.这可能吗?

And*_*all 9

只需重新分配:

Acme::Address::STREET_NAME = "1 Infinite Loop"
Run Code Online (Sandbox Code Playgroud)

冻结一个对象只会冻结:对象,而不是变量(引用)本身.重新分配一个常量会给你一个警告:

警告:已初始化常量 STREET_NAME

因为重新分配一个常量通常不是一个好主意 - 但这是Ruby,并且因为一切都是动态的,所以常量并不是真正的常量.在初始化程序中执行此操作应该可以正常工作.

  • 只是添加:如果你想避免警告,你可以在重新分配之前执行`Acme :: Address.send:remove_const,:STREET_NAME`. (3认同)