ruby-on-rails - 为什么在重新打开类(class)时有时会使用 class_eval?

标签 ruby-on-rails ruby metaprogramming 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 向现有类“添加”一些内容,而您的第二个示例只是定义了新类并覆盖了之前的所有内容。 例如,当您想要 monkeypatch 或扩展库时,就会使用它。

关于ruby-on-rails - 为什么在重新打开类(class)时有时会使用 class_eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30009315/

相关文章:

html - Bootstrap 下拉菜单在 Rails 中不起作用

ruby-on-rails - 如何修复丢失的模板错误?

ruby - 如何禁用 NewRelic 日志

go - 在 Go 中使用元编程解析网络协议(protocol)

typescript - 在 typescript 中,我可以使用键列表从对象中删除未定义和空类型吗?

c++ - 具有某种条件的宏

ruby-on-rails - Sublime Text ruby​​ .erb block 注释键盘快捷键?

ruby-on-rails - 在 Ruby Rspec 自动化中集成数据库清洁器 gem 的问题

ruby-on-rails - 无法打开与本地主机 :3101 - Rails/Docker 的 TCP 连接

ruby - Vagrant & Custom Chef 资源