加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 变量如何绑定到define_method的主体?

发布时间:2020-12-17 03:26:02 所属栏目:百科 来源:网络整理
导读:在尝试提高我的 Ruby技能时,我一直在讨论这个案例,我只能通过阅读API文档找不到解释.非常感谢您的解释.这是示例代码: for name in [ :new,:create,:destroy ] define_method("test_#{name}") do puts name endend 我希望/期望发生的是name变量将绑定到给定
在尝试提高我的 Ruby技能时,我一直在讨论这个案例,我只能通过阅读API文档找不到解释.非常感谢您的解释.这是示例代码:

for name in [ :new,:create,:destroy ]
  define_method("test_#{name}") do
    puts name
  end
end

我希望/期望发生的是name变量将绑定到给定于define_method的块,并且当调用#test_new时它将输出“new”.而是每个定义的方法输出“destroy” – 分配给name变量的最后一个值.我对define_method及其块有什么误解?谢谢!

解决方法

Ruby中的块是闭包:传递给define_method的块捕获变量名本身 – 而不是它的值 – 因此只要调用该块,它就会保留在作用域中.这是拼图的第一部分.

第二部分是define_method定义的方法是块本身.基本上,它将Proc对象(传递给它的块)转换为Method对象,并将其绑定到接收器.

所以你最终得到的是一个捕获(关闭)变量名的方法,当你的循环完成时,它被设置为:destroy.

另外:for … in …实际上创建了一个新的局部变量,相应的[…] .each {| name | ……}建设不行.也就是说,你的for … in循环等价于以下(无论如何都在Ruby 1.8中):

name = nil
[ :new,:destroy ].each do |name|
  define_method("test_#{name}") do
    puts name
  end
end
name # => :destroy

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读