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阅读 135,403评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,828评论 0 9
  • Google的Objective-C编码规范 总览 背景知识 Objective-C是一个C语言的扩展语言...
    渣渣程序猿爱次次大餐阅读 5,505评论 0 3
  • 礼包点开之后的处理 现在礼包点开之后,由于在手机端,例如安卓机型,用户点击返回键,这时系统又进入了第一个选题界面(...
    芊与芊爸阅读 890评论 0 0