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,我可以得到我想要的东西。
但是,用块或前后在块和proc之间包装yield对我来说不太合适。
有没有更简洁的方法?
发布于 2017-10-09 15:54:16
如果需要将一个块传递给该方法,我将选择第二个选项。至少这样,该参数在方法签名中,并且它使它更明显地表明它是必需的。
此外,如果没有提供块,我将引发ArgumentError:
def refactor(&block)
raise ArgumentError.new("Block required") unless block
(1..5).select(&:even?).map(&block)
end发布于 2017-10-25 01:41:11
我发现Rails问题#30973和红宝石杂志#14045回答了我的问题。
据红宝石问题称,
如果不使用块参数,就无法将给定的块传递给其他方法。
所以除了refactor或refactor2和
back and forth between block and proc does not feel right to me.这是我真正关心的绩效问题。
Rails通过使用refactor方法来处理这个性能问题。
https://stackoverflow.com/questions/46645681
复制相似问题