我在 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
当您不想将任何内容传递给新代码时,使用是否有任何优势?
我在 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 向现有类“添加”一些东西,而您的第二个示例只是定义了新类并覆盖了之前的所有内容。例如,当您想要猴子补丁或扩展库时使用它。