"a-6ren">
gpt4 book ai didi

ruby - 将符号传递给 block 方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:55 24 4
gpt4 key购买 nike

inject 等一些 block 方法可以选择使用符号而不是 block :

%w[a b c].inject(&:+)
# => "abc"
%w[a b c].inject(:+)
# => "abc"
%w[a b c].inject("", :+)
# => "abc"

map 等其他 block 方法不能:

%w[a b c].map(&:upcase)
# => ["A", "B", "C"]
%w[a b c].map(:upcase)
# => ArgumentError: wrong number of arguments (1 for 0)

为什么后者不能带符号?

最佳答案

对于 inject, block (或替代 block )是必需的。如果它没有传递一个 block ,那么必须至少有一个参数,最后一个参数必须是一个符号,并且 block 将由它构成。无论如何,都没有歧义;最后一个参数用于在缺少 block 时构造 block 。

对于map, block 是可选的。如果没有给出 block ,则返回值将是一个 Enumerator 实例。因此,从一个 block 是否被传递的信息中,不能决定是否应该使用最后一个参数来构造一个 block 。

map 的特殊情况下,它不带参数,所以说一个额外的参数应该被当作一个 block 是有道理的,但是判断是否最后一个参数将根据 arity 被视为一个 block 。并且也失去了 future 改变方法元数的可能性。

关于ruby - 将符号传递给 block 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com