重构一个表达式,该表达式将一个块带入方法及其块参数

时间:2017-10-09 11:45:20

标签: ruby refactoring

a = (1..5).select(&:even?).map do |s|
  s * 2
end
a #=> [4, 8] 

在Ruby中,我想将a的右侧表达式重构为方法及其块参数。

def refactor
  (1..5).select(&:even?).map { |e| yield e }
end

def refactor2(&block)
  (1..5).select(&:even?).map(&block)
end

b = refactor do |s|
  s * 2
end
b #=> [4, 8]

使用refactorrefactor2,我可以得到我想要的内容。

但是用yield包裹 在块和proc之间来回对我来说感觉不对。

还有更简洁的方法吗?

2 个答案:

答案 0 :(得分:1)

如果你需要一个块传递给方法,我会选择第二个选项。至少这种方式参数在方法签名中,这使得它更加明显是必需的。

此外,如果没有提供阻止,我会提出ArgumentError

def refactor(&block)
  raise ArgumentError.new("Block required") unless block

  (1..5).select(&:even?).map(&block)
end

答案 1 :(得分:0)

我发现Rails issue #30973Ruby issue #14045回答了我的问题。

根据Ruby issue

  

如果不使用块参数,则无法将给定块传递给其他方法。

除了refactorrefactor2

之外别无他法
back and forth between block and proc does not feel right to me.

这对我的表现非常关注。

Rails使用refactor方法处理此性能问题。