我可以在这个代码上使用一些帮助:
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”中并行运行每个方法/块调用(在它自己的线程中),并在每个方法调用周围添加一些日志记录。
答案 0 :(得分:1)
我同意上述情况,你应该解释你想要做什么,因为可能有更合适的模式可供使用。
顺便说一句,你可以通过一个小小的改变做你要求的事情:result1, result2 = do_stuff {
[
method_1,
method_2,
method_3
]
}
或者,更优雅的是,没有阻止:
result1, result2 = [
method_1,
method_2,
method_3
]
:)
答案 1 :(得分:1)
好的,问题更新后看起来更清晰。您可以使用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
但是要小心,这不是经过充分测试的,我不确定线程是否安全。