簡體   English   中英

(class_eval,define_method)vs(instance_eval,define_method)的Ruby單例方法

[英]Ruby singleton methods with (class_eval, define_method) vs (instance_eval, define_method)

紅寶石中的元編程很棒,因為我經常使用它來模仿基於原型的編程,並快速編寫原型解決方案來測試某些問題以測試其可行性。 因此,我想知道以下代碼段之間是否有本質區別:

(class << some_object; self; end).class_eval do
  define_method(:method_name) do ... method body ... end
end

(class << some_object; self; end).instance_eval do
  define_method(:method_name) do ... method body ... end
end

這兩個版本的代碼都定義了一個單例方法,我還沒有遇到任何迫使我選擇(instance_eval, define_method)組合而不是(class_eval, define_method)組合來定義一個單例方法的問題,我想知道兩者之間是否有本質區別。

define_method沒有區別。 但是使用def會有區別。

o = Object.new  

# class_eval example
class << o; self; end.class_eval { def test1;  :test1; end  }
o.test1 #=> test1

# instance_eval example
class << o; self; end.instance_eval { def test2; :test2; end }
o.test2 #=> NoMethodError

為什么defdefine_method行為有所不同? define_method是一個方法調用,因此在eval上下文中對self進行操作。 self兩個instance_evalclass_eval是相同的-它是接收機(鄰的eigenclass)。

但是def行為有所不同,它不會對self進行操作,而是對default define class_evaldefault definee下, default defineeself相同,但對於instance_eval它是self的元類。

我們如何訪問上面定義的test2方法? test2必須是在o的本征類的元類上定義的實例方法。

它是o的本征類的類方法:

class << o; test2; end #=> :test2

暫無
暫無

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

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