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]
使用refactor
或refactor2
,我可以得到我想要的内容。
但是用yield
包裹
在块和proc之间来回对我来说感觉不对。
还有更简洁的方法吗?
答案 0 :(得分:1)
如果你需要一个块传递给方法,我会选择第二个选项。至少这种方式参数在方法签名中,这使得它更加明显是必需的。
此外,如果没有提供阻止,我会提出ArgumentError
:
def refactor(&block)
raise ArgumentError.new("Block required") unless block
(1..5).select(&:even?).map(&block)
end
答案 1 :(得分:0)
我发现Rails issue #30973和Ruby issue #14045回答了我的问题。
根据Ruby issue,
如果不使用块参数,则无法将给定块传递给其他方法。
除了refactor
或refactor2
和
back and forth between block and proc does not feel right to me.
这对我的表现非常关注。
Rails使用refactor
方法处理此性能问题。