ruby-on-rails - define_method 在调用方法之前不使用变量?

标签 ruby-on-rails ruby

我无法从 for 循环中获取变量。似乎 i(var) 是稍后计算的,而不是我完全需要的类定义。

ree-1.8.7-2010.02 > class Pat
ree-1.8.7-2010.02 ?>  for i in 39..47
ree-1.8.7-2010.02 ?>    define_method("a#{i}".to_sym) do
ree-1.8.7-2010.02 >         puts i 
ree-1.8.7-2010.02 ?>      end
ree-1.8.7-2010.02 ?>    end
ree-1.8.7-2010.02 ?>  end
#=> 39..47 

ree-1.8.7-2010.02 > p = Pat.new
#=> #<Pat:0x103c31140> 

ree-1.8.7-2010.02 > p.a39
47
#=> nil 

ree-1.8.7-2010.02 > p.a49
NoMethodError: undefined method `a49' for #<Pat:0x103c31140>
    from (irb):69
    from :0
ree-1.8.7-2010.02 > p.a40
47
#=> nil 

我应该使用 def 吗?如果是这样,我怎样才能获得我在此处使用 def 获得的动态方法名称。

最佳答案

那里发生的事情有点微妙...您正在使用的传统 for 循环在所有迭代中共享单个“i”变量...闭包( block 密码到 define_method)正在捕获“i” - 并且因为只有一个“i”,它们都将(在 for 循环的末尾)捕获“i”的最终值,这是您正在循环的范围内的最后一个值。

替代方案:

class C
  (1..10).each {|i| define_method("a#{i}") { puts i } }
end

关于ruby-on-rails - define_method 在调用方法之前不使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5554793/

相关文章:

ruby-on-rails - 将 ActiveRecord 数组序列化属性转换为字符串

ruby-on-rails - ruby 类变量是否在 Rails 请求之间被清除?

javascript - 使用 Javascript 解析 vcard

ruby-on-rails - 在 ActiveJob 中排队多个作业

ruby-on-rails - ActionController::UnknownFormat (格式.csv)

ruby-on-rails - 安装 Rails 时出错 : Failed to build Gem native extension, 'lack of libraries or headers'

ruby-on-rails - 如何在 rails 4.2.4 中使用正确版本的 mongo、mongoid、bson、bson_ext?

ruby (石头剪刀布)

ruby - 比较运算符不起作用(在 erb View 中)

ruby-on-rails - 将变量发布到另一个 Controller