0

我想到了一个看起来并不复杂的设计问题,但我自己找不到解决它的方法。我想尽可能地遵循DRY原则。

我有两个功能。一个是算法的基本版本,另一个是并行编程的改进。它们是两个,我的目标是只编写其中一个并带有附加参数,例如“并行”。这里是伪代码。

fun1 ()
    loop for par1 times
        do_work()

fun2 ()
    loop for par1 times
        run new thread
            do_work()

目前我已经编码

if parallel == 0
    fun1 ()
else
    fun2 ()

我想要的是类似的东西

fun ()
    loop for par1 times
        run new thread if parallel > 0 #Ruby's syntax-like
            do_work()

我想知道 Ruby 是否可以帮助我解决这个问题。我是 Ruby 的新手,所以我不确定它的函数式编程是否会有所作为。

4

1 回答 1

1

像这样:

def fun(parallel=false)
  if parallel
    # called as fun(true)
  else
    # called as fun
  end
end

parallel=false如果没有传递参数,则设置默认参数值。

或者您可以使用选项哈希更明确地传递参数

def fun(options={})
  parallel = option[:parallel] || false
  if parallel
    # called as fun(parallel: true)
  else
    # called as fun
  end
end

另一种方法是始终do_work()在线程中运行并根据parallel参数等待线程完成。

def fun(parallel=false)
  workers = []
  par1.times do
    worker = Thread.new { do_work() }
    worker.join if parallel
    workers << worker
  end
  workers.each(&:join)
end
于 2012-05-29T08:10:28.860 回答