我是一个 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/