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&超低优先级.这样,解析器可以只验证语法规则并忽略块参数本身(必须在运行时进行评估). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |