ruby 元編程中的動態創建方法define_method

define_method

動態定義方法,只需要提供一個方法名和充當方法主體的塊。

  1. 一個簡單的栗子
class Myclass
    define_method :my_method do |my_arg|
      my_arg * 3
    end
end
########
obj = Myclass.new
obj.my_method(2)      #=> 6

Myclass類里邊動態添加了一個my_method的實例方法,同時得出結果6。

2.稍微復雜一點的栗子

class Myclass
  def self.define_say(name)
    define_method name do
      "#{name} say: 'I`m #{name}!'"
    end
  end
end
######
Myclass.define_say('xiaoming')      #=> xiaoming

這個栗子坐下來,貌似跟我想的有點不一樣,我想要的結果是-->xiaoming say: 'I`m xiaoming!'

然后打了一個斷點,看了一下運行時的狀態:


     7: def self.define_say(name)
 =>  8:   binding.pry
     9:   define_method name do
    10:     "#{name} say: 'I`m #{name}!'"
    11:   end
    12: end

[1] pry(Myclass)> define_method name do
[1] pry(Myclass)*   "#{name} say: 'I`m #{name}!'"
[1] pry(Myclass)* end
=> :xiaoming

發現在跑define_method name do ......這段代碼之后,其實動態生成的是一個實例方法,隨后我又在這段代碼前后打斷點加了查詢方法的代碼之后終于解決了疑惑。

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,789評論 0 9
  • Google的Objective-C編碼規范 總覽 背景知識 Objective-C是一個C語言的擴展語言...
    渣渣程序猿愛次次大餐閱讀 1,602評論 0 3
  • 禮包點開之后的處理 現在禮包點開之后,由于在手機端,例如安卓機型,用戶點擊返回鍵,這時系統又進入了第一個選題界面(...
    芊與芊爸閱讀 126評論 0 0