3

我在 Rails 应用程序中遇到了一些代码,形式为

ThirdPartyLibrary::Foo.class_eval do
  def bar?
    @bar_field == 'true'
  end
end

我想知道为什么他们不只是这样做

class ThirdPartyLibrary::Foo
  def bar?
    @bar_field == 'true'
  end
end

class_eval当您不想将任何内容传递给新代码时,使用是否有任何优势?

4

1 回答 1

0
class ThirdPartyLibrary::Foo do
  def original?
    true
  end
end

ThirdPartyLibrary::Foo.class_eval do
  def baz?
    true
  end
end

ThirdPartyLibrary::Foo.original? #=> true
ThirdPartyLibrary::Foo.baz? #=> true

class ThirdPartyLibrary::Foo
  def bar?
    true
  end
end

ThirdPartyLibrary::Foo.original? #=> undefined method
ThirdPartyLibrary::Foo.baz? #=> undefined method
ThirdPartyLibrary::Foo.bar? #=> true

class_eval 向现有类“添加”一些东西,而您的第二个示例只是定义了新类并覆盖了之前的所有内容。例如,当您想要猴子补丁或扩展库时使用它。

于 2019-02-27T08:22:48.130 回答