Как мне вызвать несколько процедур? - PullRequest
1 голос
/ 15 августа 2011

Я мог бы использовать некоторую помощь по этому вопросу, учитывая этот код:

result1, result2, result3 = do_stuff {
  method_1
  method_2
  method_3
}

Я хотел бы иметь возможность написать метод с именем do_stuff, который может вызывать каждую строку этого блока по отдельности и возвращать результатдля каждой строки / блока.Это можно сделать?Я поступаю об этом неправильно?Нечто подобное (совсем не работает) - вот о чем я думаю.

def do_stuff(&block)
  block.each_block do |block|
    block.call
  end
end

РЕДАКТИРОВАТЬ: я пытаюсь добиться того, чтобы иметь возможность запускать каждый вызов метода / блока внутри метода "do_stuff""параллельно (в своем собственном потоке), а также добавить некоторые журналы вокруг каждого вызова метода.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

ОК, выглядит яснее после обновления вопроса. Вы можете сделать что-то вроде этого, используя method_missing, instance_eval и потоки:

class Parallelizer
  class << self
    def run(receiver, &block)
      @receiver = receiver
      instance_eval &block
      # wait for all threads to finish
      @threads.each{|t| t.join}
      @results
    end

    def method_missing *args, &block
      @threads ||= []
      @results ||= []
      @threads.push Thread.new{
        # you could add here custom wrappings
        @results.push(@receiver.send(*args, &block))
      }
    end
  end
end

class Test
  def take_a_break name, sec
    puts "#{name} taking a break for #{sec} seconds"
    Kernel.sleep sec
    puts "#{name} done."
    name
  end
end

t = Test.new

results = Parallelizer.run(t) do
  take_a_break 'foo', 3
  take_a_break 'bar', 2
  take_a_break 'baz', 1
end

Тем не менее, будьте осторожны, это не очень хорошо протестировано, и я не уверен, насколько безопасен поток.

1 голос
/ 15 августа 2011

Я согласен с мю выше, вам следует объяснить, что вы пытаетесь сделать, так как, вероятно, есть более подходящий шаблон для использования.

Кстати, вы можете сделать то, что вы просите, с небольшим изменением:

result1, result2 = do_stuff {
  [
    method_1,
    method_2,
    method_3
  ]
}

или, возможно, более элегантно, без блока:

result1, result2 = [
  method_1,
  method_2,
  method_3
]

:)

...