ruby - 在循环内创建的过程访问循环变量时出现问题

标签 ruby

我是一个 ruby​​ 新手,在循环内创建的过程访问循环变量时遇到问题。这是演示该问题的代码文件。

class Route
    def initialize options = {}
    options.each do |k,v| 
            self.instance_variable_set("@#{k}", v)
            self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")})
      self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)})
        end
    end
end

routes = []
routes << Route.new({ :url=>'/one', :content=>'html1' })
routes << Route.new({ :url=>'/two', :content=>'html2' })

blocks = []
for route in routes
        blocks << Proc.new { route.content }
end

puts blocks[0].call #=> 'html2'
puts blocks[1].call #=> 'html2'

如何使blocks[0].call返回'html1'和blocks[1].call返回'html2'

最佳答案

您可以在 block 内创建 Proc,为每个 Proc 提供不同的上下文:

class Route
  def initialize(options = {})
    options.each do |k,v| 
      self.instance_variable_set("@#{k}", v)
      self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")})
      self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)})
    end
  end
end

routes = []
routes << Route.new({ :url=>'/one', :content=>'html1' })
routes << Route.new({ :url=>'/two', :content=>'html2' })

blocks = routes.map { |e| Proc.new { e.content } }

puts blocks[0].call #=> 'html1'
puts blocks[1].call #=> 'html2'

关于ruby - 在循环内创建的过程访问循环变量时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/412089/

相关文章:

ruby-on-rails - Rails 3 的动态字段

mysql - 根据在 Rails 中创建时添加的其他字段更新 MySQL 字段

ruby - 如何将数组转换为哈希 : integer count

ruby - 字符串操作

ruby - 使用 Nokogiri 禁用 XML 中的 HTML 转义

ruby-on-rails - Rails 中的上下文绑定(bind)

ruby-on-rails - 如何在 Rails 中实现动态 404、500 等错误页面?

ruby-on-rails - 无效命令 'PassengerDefaultRuby'

Ruby Datamapper 按最大分组

ruby-on-rails - 在 Rspec 的 API Controller 测试模块中出现委托(delegate)错误