2017-10-09 14 views
1
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之间来回不觉得对我来说是正确的。

有没有更简洁的方法?

+0

这完全取决于用例。我的直觉说,这个方法应该返回一个枚举器(如果你想做一些除map之外的事情呢?),但是我不明白你的问题的目的是什么。 – Max

回答

1

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

此外,如果没有提供块我会提高ArgumentError

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

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

我不认为这会引发一个ArgumentError如果没有提供块......'def foo(&blk); [1] .map(&blk); end; foo.to_a == [1]' –

+0

你是对的,block参数可能是'nil'。我的部分愚蠢的错误,我会更新我的答案。 – csexton

0

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

根据Ruby issue

没有办法通过给定的块以其它方法,而无需使用块参数。

所以没有办法比refactorrefactor2

back and forth between block and proc does not feel right to me. 

这是我关心的是真正的相对于其他的性能。

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

相关问题