我在 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
有什么优势吗?
最佳答案
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 向现有类“添加”一些内容,而您的第二个示例只是定义了新类并覆盖了之前的所有内容。 例如,当您想要 monkeypatch 或扩展库时,就会使用它。
关于ruby-on-rails - 为什么在重新打开类(class)时有时会使用 class_eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30009315/