Проблема с процессами, созданными в циклах, обращающихся к переменным цикла - PullRequest
2 голосов
/ 05 января 2009

Я новичок в рубине, и у меня проблема с проками, созданными внутри циклов, обращающихся к переменным цикла. Вот файл кода, демонстрирующий проблему.

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'

Как сделать, чтобы блоки [0] .call возвращали 'html1', а блоки [1] .call возвращали 'html2'

1 Ответ

3 голосов
/ 05 января 2009

Вы можете создать Procs внутри блока, чтобы обеспечить каждый 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...