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 ......这段代码之后,其实动态生成的是一个实例方法,随后我又在这段代码前后打断点加了查询方法的代码之后终于解决了疑惑。