define_method
動態定義方法,只需要提供一個方法名和充當方法主體的塊。
- 一個簡單的栗子
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