是否可以在 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 是一个懒惰的autoloaded 类,而您在加载Foo 之前“重新定义”initialize

试试这个

Foo.class_eval do
  def initialize
    @hello = "welt"
  end
end

这会强制在重新定义任何内容之前加载 Foo

【讨论】:

以上是关于是否可以在 Ruby 中重新定义初始化方法?的主要内容,如果未能解决你的问题,请参考以下文章

定义? Ruby 和 Rails 中的方法

ruby 练习:构建一个简单的猜谜游戏创建一个GuessingGame类,用一个名为answer的整数初始化。定义一个实例方法

ruby 练习:构建一个简单的猜谜游戏创建一个GuessingGame类,用一个名为answer的整数初始化。定义一个实例方法

用不同的参数和默认值在 Ruby 中初始化类的最有效方法是啥?

是否可以防止在 Cordova 中重新初始化应用程序?

是否再次调用 model.fit 方法重新初始化已经训练的权重?