ruby 元编程中的动态创建方法define_method

2016-06-14  本文已影响502人  村南一枝花

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
上一篇下一篇

猜你喜欢

热点阅读