链接块通过红宝石

时间:2014-04-01 16:39:29

标签: ruby block

假设我有一个数组

array = [[2], [1], [0]]

我可以这样做:

array.map(&:any?)
# => [true, true, true]

我可以这样做:

array.map do |x|
    x.any?(&:zero?)
end
# => [false, false, true]

为什么我不能这样做? (或类似的东西):

array.map(&:any?(&:zero?))

返回SyntaxError:unexpected'(',期待')'

array.map(安培;:任何(安培;:零)?)

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

因为:any?(&:zero?)不是合适的符号文字。你可以通过:"any?(&:zero?)"使它成为一个符号,但仍然没有这样的方法。

答案 1 :(得分:3)

其他答案中解释了原因。但是,如果定义了proc:

,则可以使用快捷方式
any_zeros= ->(o) { o.any?(&:zero?) }
array = [[2], [1], [0]].map(&any_zeros)

答案 2 :(得分:2)

为什么呢?简单回答:因为Ruby没有包含它的语法。

您基本上是尝试将默认参数传递给该方法。在某些时候,Ruby开发人员做出了这样一个决定:像这样的功能是太多的工作和使用这个小代码可以实现的目标的额外复杂性:

array.map {|e| x.any?(&:zero?)}