加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 阻止一元`&`的优先级

发布时间:2020-12-17 03:10:53 所属栏目:百科 来源:网络整理
导读:考虑以下 Ruby代码: [1,3].any? :even? || true# = false[1,3].any? nil || :even?# = false[1,3].any? nil || :odd?# = true 所以看起来像布尔 – 或||具有更高的优先权而不是一元和一元.我没想到这一点.这是对的,它是否记录在任何地方? 解决方法 这就是(
考虑以下 Ruby代码:

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

所以看起来像布尔 – 或||具有更高的优先权而不是一元和一元.我没想到这一点.这是对的,它是否记录在任何地方?

解决方法

这就是(错误地诽谤)和/或关键字的用途.你应该写那个

[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 /和/或.

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

所以你的例子相当于

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

现在如果&在某种程度上是高优先级,这要么是在运行时评估的完全正常的值,要么是一个高度限制的特殊句法结构&:even?.在运行时发现语法错误并不好,所以我猜开发人员选择以简单的方式解决它:make&超低优先级.这样,解析器可以只验证语法规则并忽略块参数本身(必须在运行时进行评估).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读