【问题标题】:Operator precedence of assignment and conditional operators赋值运算符和条件运算符的运算符优先级
【发布时间】:2010-12-15 14:39:06
【问题描述】:

我正在阅读一本关于 Ruby 1.8 和 1.9 的书,名为“The Ruby Programming Language”。这本书说 if-operator 的优先级低于 assignment-operator。如果这是真的,那么我不明白这个表达式是如何工作的:

x = 5 if false

如果赋值运算符具有更高的优先级,那么它应该在 if 运算符之前执行。因此,在执行if false 之前,应将 5 分配给 x。

我误解了优先级吗?

【问题讨论】:

    标签: ruby assignment-operator operator-precedence


    【解决方案1】:

    较高的赋值优先级意味着您的表达式计算结果为(x = 5) if false,而不是x = (5 if false)。请注意,这也是一个完全有效的表达式。

    每个特定子句是否执行由语言规则决定。例如,在三元运算符a ? b : c 中,只会执行bc,但不会同时执行。

    编辑
    关于区别。

    x = (5 if false) 中,首先处理分配。但要完成它,我们需要赋值的左边部分,即nil,因为5 if false 的计算结果为nil。所以,表达式等价于x = nil

    (x = 5) if false 中,首先处理条件运算符。根据其规则,我们首先必须评估条件(false)。既然是false,那就没什么可做的了,评估结果是nil

    希望这很清楚。

    【讨论】:

    • +1 个很好的例子。将优先级规则视为括号的替代品——它们告诉您事物是如何分组的,并且与“之前”或“之后”没有任何关系。
    • 我的理解是“x = 5 if false”实际上等同于“x = (5 if false)”,但我想我错了,有什么区别?跨度>
    • @tokland 我已经更新了答案,如果有帮助,请告诉我。正如 Nakilon 所述,您可以将 x = 5 if false 重写为 if (false) {x = 5}
    • 谢谢,@nikita。对此做了一些测试,我发现了一些我不知道的东西,这可能是微不足道的,但看起来有点奇怪: (a, b not defined) if false; a = 1; b = 2;结尾; p([a, b].inspect) 给出“[nil, nil]”
    【解决方案2】:

    因为<expr> if <condition> 不是一个单一的表达式。它是 Ruby 的一种特殊语法糖。它的工作原理如下:

    if <condition>
        <expr>
    end
    

    显然,&lt;expr&gt; 必须在 &lt;condition&gt; 之后进行评估,因为 &lt;condition&gt; 可以是 false

    【讨论】:

    • &lt;condition&gt; ? &lt;expr&gt; : nil 会是更正确的替代品。你不能用普通的if 语句真正重写doIt(3 if condition),这甚至不是很复杂的例子。
    • @Nikita Rybak,不,我可以。 p(if some_boolean ; 0 ; end) 效果很好。 P.S.:我同意?:——它有两个级别的操作,很好地说明了a if b
    • 是的,但这有点破坏了“不是一个表达式”的一部分:) if some_boolean ; 0 ; end 在您的示例中被用作一个表达式。
    • @Nikita Rybak, if some_boolean ; 0 ; end 正是答案中发布的内容。
    猜你喜欢
    • 2012-12-09
    • 2020-08-22
    • 2018-08-14
    • 2013-03-27
    • 2015-08-24
    • 2023-03-07
    • 2021-03-05
    相关资源
    最近更新 更多