簡體   English   中英

為什么在重新打開類時可以有時使用class_eval?

[英]Why is class_eval sometimes used when re-opening the class could work?

我已經在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向現有的類“添加”某些東西,您的第二個示例僅定義了new類,並覆蓋了之前的所有內容。 例如,當您要猴子補丁或擴展庫時使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM