【问题标题】:Why do disjunction and conjunction in words need parenthesis?为什么单词中的析取和连词需要括号?
【发布时间】:2014-08-05 22:38:56
【问题描述】:

||&&相反,参数位置的单词(orand)中的分离和连接需要额外的括号。

def foo _; end

foo(1 || 2) # => Good
foo(1 or 2) # => Syntax error
foo((1 or 2)) # => Good

foo(1 && 2) # => Good
foo(1 and 2) # => Syntax error
foo((1 and 2)) # => Good

为什么他们需要额外的括号?

【问题讨论】:

    标签: ruby argument-passing


    【解决方案1】:

    我认为这是因为逻辑组合运算符andorprecedence 低于方法的参数列表,因此当找不到另一个列表参数或括号时解析器失败。

    另一方面,逻辑运算符 &&|| 具有更高的优先级,因此它们的参数被更快地求值,然后表达式的结果作为参数传递给方法。

    独立括号改变关联性,所以foo (1 or 2) 确实有效,1 作为结果传递给foo 方法。

    【讨论】:

    • @sawa 是的,parens 包含方法参数是一个完全不同的情况,然后 parens 强制执行评估的关联性。对于前者,方法名称后面不允许有空格。
    • Ruby style guide does recommend just saying no to and and or。小心空间技巧。如果您的方法然后采用 2 个参数,第一个是 (1 or 2) 您需要执行 foo (1 or 2),3 foo (1 or 2,3) 类似的语法错误。同样有趣的是,使用单个参数方法,您可能倾向于删除括号产生不同的结果:foo 1 or 2 === foo(1) or 2 ==> 2foo 1 || 2 === foo(1 || 2) ==> nil
    • @Charlie 好点,只是对带有多个方法参数的示例有点挑剔。表达式foo (1 or 2,3) 与前面的示例有点不同,并且与foo 方法无关。 (1 or 2,3) 单独只是一个无效的表达式,即。 (_, _) 不是 Ruby 中的有效构造函数。
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2019-10-27
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多