在Ruby 2.2中使用proc干燥块

时间:2015-05-08 20:45:49

标签: ruby

我有一段我想要干的代码:

def start
  queue1.pop_all do |record|
    # some non-trivial logic
  end
  queue2.subscribe_one do |record|
    # the same set of non-trivial logic
  end
end

我提出的一种方法是创建一个返回proc的私有方法:

def start
  queue1.pop_all(&sync)
  queue2.subscribe_one(&sync)
end

private

def sync
  return proc do |record|
    # some non-trivial logic
  end
end

这是一种合理的方法吗?或者是否有更好,更清晰的方法来组织代码?

1 个答案:

答案 0 :(得分:2)

在我看来,您的解决方案看起来很好。替代方案包括:

从您的区块中调用常用方法:

def start
  queue1.pop_all{ |record| sync(record) }
  queue2.subscribe_one{ |record| sync(record) }
end

在您的示例中,您从方法中发出一个proc,它在每次调用方法时都会重新创建proc。要解决此问题,您可以将公共proc作为变量,而不是方法调用的结果:

def start
  sync = lambda{|record| /* non-trivial stuff */ }

  queue1.pop_all(&sync)
  queue2.subscribe_one(&sync)
end