1

このコードを考えると、これについていくつかの助けを借りることができます:

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」内で各メソッド/ブロック呼び出しを並行して(独自のスレッドで)実行し、各メソッド呼び出しの周りにログを追加できるようにすることです。

4

2 に答える 2

1

OK、質問が更新された後、より明確に見えます。method_missinginstance_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

ただし、これは十分にテストされておらず、どの程度スレッドセーフかはわかりません。

于 2011-08-16T07:45:44.890 に答える
1

上記のmuに同意します。使用するのに適したパターンがおそらくあるため、何をしようとしているのかを説明する必要があります。

ところで、マイナーな変更であなたが求めることを行うことができます:

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

または、おそらく、よりエレガントに、ブロックなしで:

result1, result2 = [
  method_1,
  method_2,
  method_3
]

:)

于 2011-08-15T06:04:19.757 に答える