gpt4 book ai didi

ruby - to-block 一元 `&` 的优先级

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

考虑以下 Ruby 代码:

[1,3].any? &:even? || true
# => false
[1,3].any? &nil || :even?
# => false
[1,3].any? &nil || :odd?
# => true

所以看起来 Boolean-or || 比 to-proc 一元 & 有更高的优先级。我没想到会这样。是这样吗?是否在任何地方记录了它?

最佳答案

这就是(错误中伤的)andor 关键字的用途。你应该这样写

[1,3].any? &:even? or true

至于为什么会这样——我找不到这方面的文档——但我认为这实际上与可选括号和一元 & 的限制有关。

一元 & 是特殊的。像 ~ 这样的“普通”运算符本质上是方法调用的语法糖;你可以把它们放在任何你想要的地方。但是 &只允许在方法参数中,即使这样也只能在最后。

foo x, &bar
# NameError, determined at runtime because it has to see if any of these names are defined
foo &bar, x
# SyntaxError! Didn't even make it past the parser

y = bar
# NameError
y = &bar
# SyntaxError!

当您在方法调用中省略括号时,它会吞掉几乎所有内容,仅在超低优先级的内容(如 if/unless/and/or)处停止。

foo bar baz if true
# same as
foo(bar(baz)) if true

所以你的例子等同于

[1,3].any?(&:even? || true)

现在,如果 & 以某种方式具有高优先级,这要么是一个在运行时评估的完全正常的值 true,要么是一个高度受限的特殊语法结构 &:偶数?。在运行时发现语法错误不是一件好事,所以我猜开发人员选择了一种简单的方法来解决它:使 & 超低优先级。这样解析器就可以只验证语法规则并忽略 block 参数本身(必须在运行时评估)。

关于ruby - to-block 一元 `&` 的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50839430/

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