【问题标题】:How do I call multiple procs?如何调用多个 proc?
【发布时间】:2011-08-15 04:07:58
【问题描述】:

鉴于此代码,我可以在这方面使用一些帮助:

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”中并行运行每个方法/块调用(在它自己的线程中),并在每个方法调用周围添加一些日志记录。

【问题讨论】:

  • 也许您可以告诉我们您真正想要完成的工作。
  • 确实,因为简短的回答是“否”:-)
  • 我希望能够在方法“do_stuff”中并行运行每个方法/块调用(在它自己的线程中),并在每个方法调用周围添加一些日志记录。

标签: ruby lambda closures block proc-object


【解决方案1】:

我同意上面的 mu,你应该解释你想要做什么,因为可能有更合适的模式可以使用。

顺便说一句,您只需稍作改动即可满足您的要求:

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

或者,也许,更优雅,没有块:

result1, result2 = [
  method_1,
  method_2,
  method_3
]

:)

【讨论】:

    【解决方案2】:

    好的,问题更新后看起来更清晰了。你可以这样做,使用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
    

    但请注意,这没有经过充分测试,我不确定线程​​安全性如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多