是否可以在 Ruby 中重新定义初始化方法?
Posted
技术标签:
【中文标题】是否可以在 Ruby 中重新定义初始化方法?【英文标题】:Is it possible in Ruby to redefine a initialize method? 【发布时间】:2016-08-09 21:05:03 【问题描述】:我有一个像这样的第三方代码:
class Foo
def initialize
@hello = "world"
end
def msg
@hello
end
end
然后,我添加了一个包含这些内容的新文件foo_redefinition.rb
class Foo
def initialize
@hello = "welt"
end
end
然后,另一个第三方代码在我的主类中调用了一个方法,在我的主类的文件中我调用了require_relative 'foo_redefinition'
。但是,当第三方代码(在调用我的方法之后,从而读取我的主文件,需要重新定义)调用 Foo.msg 时,它返回“world”,而不是“welt”。
还有,当我这样做时
require_relative 'foo_redefinition'
# ... lots of code
Foo::new.msg #=> world (instead of welt)
我的问题是:
-
是否可以重新定义初始化方法?
如果是这样,我在这里做错了什么?
【问题讨论】:
initialize
是一种与任何其他方法一样的方法。它绝对没有什么特别之处。所以,你的问题是:我可以重新定义方法吗?答案是:是的。你的第二个问题的答案是:我不知道。您的帖子中没有足够的信息。
我假设我在我希望更改的实例(并且我无权访问)已经初始化之后重新定义初始化,因此发生了更改,但没有效果。
您的问题的答案是 1) 是; 2)如果没有看到您描述的完整示例,我不知道。
【参考方案1】:
恐怕Foo
是一个懒惰的autoload
ed 类,而您在加载Foo
之前“重新定义”initialize
。
试试这个
Foo.class_eval do
def initialize
@hello = "welt"
end
end
这会强制在重新定义任何内容之前加载 Foo
。
【讨论】:
以上是关于是否可以在 Ruby 中重新定义初始化方法?的主要内容,如果未能解决你的问题,请参考以下文章
ruby 练习:构建一个简单的猜谜游戏创建一个GuessingGame类,用一个名为answer的整数初始化。定义一个实例方法
ruby 练习:构建一个简单的猜谜游戏创建一个GuessingGame类,用一个名为answer的整数初始化。定义一个实例方法