gpt4 book ai didi

Ruby 一元运算符 `&` 仅对方法参数有效

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:01 25 4
gpt4 key购买 nike

您可能知道,Ruby 有一个速记运算符 &,它让我们可以轻松地将 Symbol 转换为 Proc。示例:

%w(a b c).map(&:upcase) #=> ["A", "B", "C"]

相当于:

%w(a b c).map { |c| c.upcase } #=> ["A", "B", "C"]

解释是 &:upcase:upcase 上调用 to_proc 来创建一个 Proc 对象.

所以,这几乎解释了运算符用作方法的最后一个参数时的作用。

但是,看起来不可能在方法调用的参数之外的任何地方使用运算符:

:upcase.to_proc  => #<Proc:0x007febbc85ab38(&:upcase)>
&:upcase => SyntaxError: syntax error, unexpected &

像这样使用会很好:

case number
when &:even?
# ...
when &:prime?
# ...
end

这虽然有效:

case number
when :even?.to_proc
# ...
when :prime?.to_proc
# ...
end

简而言之,一元运算符&只能用在方法的参数中,例如arr.map(&:upcase)。这是什么原因?

最佳答案

& 一元前缀 & 运算符“解包”一个 Proc(或一个可以转换为 Proc 的对象,方法是发送to_proc 消息)放入一个 block 中,传递它就好像它已作为一个 block 传递一样。只有消息发送可以有 block 参数,因此 & 一元前缀和符号运算符只允许用于消息发送的参数列表中的最后一个参数。

同样,“双重”一元前缀和符号运算符将一个 block “打包”到 Proc 中,因此只允许用于 block 或方法定义的参数列表中的最后一个参数。

关于Ruby 一元运算符 `&` 仅对方法参数有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130526/

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