gpt4 book ai didi

ruby - 赋值运算符真的是 "just"运算符吗?

转载 作者:行者123 更新时间:2023-12-03 16:23:16 26 4
gpt4 key购买 nike

我的问题是由 this 触发的关于 SO 的讨论,这并没有导致真正解释该问题的答案。我在这里以稍微不同的方式“重写”它,因为我想让它更清楚真正的问题是什么,因此希望在这里得到答案。
考虑以下两个 Ruby 表达式:

  • 1 * a - 3
  • 1 && a = 3

  • 从 Ruby 优先级表中,我们知道这里提到的运算符 *具有最高优先级,其次是 - ,然后由 &&最后是 = .
    表达式没有括号,但是 - 正如我们可以在 irb 中验证的那样,为 a 提供合适的值在第一种情况下 - 它们被评估为好像括号被写为 (1*a) - 3 ,分别 1 && (a=3) .
    第一个很容易理解,因为 *- 更强的结合力.
    第二个不能这样解释。 &&= 更强的结合力,所以如果优先级很重要,解释应该是 (1 && a) = 3 .
    关联性( = 是右关联的, - 是左关联的)也不能解释这种效果,因为关联性只有在我们有多个相同类型的运算符时才重要(例如 x-y-zx=y=z )。
    赋值运算符中必须有一些特殊规则,我在我检查的文档中没有找到,特别是 assignment 的文档和 syntax .
    有人可以指出,赋值运算符的这种特殊行为记录在哪里?或者我在这里错过/误解了什么?

    最佳答案

    来自文档:https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#assign

    Assignment expression are used to assign objects to the variables or such. Assignments sometimes work as declarations for local variables or class constants. The left hand side of the assignment expressions can be either:

    variablesvariables `=' expression


    右边有一个表达式,所以 表达式的结果赋值给变量 .
    所以, 您应该在遵循优先级 之前查找表达式 (*) . 1 && a = 3基本上是两个“链式”表达式: 31 && 3也许它更具可读性: 1 && a = 3 + 4其中表达式为 3 + 41 && 7 , 看:
    1 && a = 3 + 4 #=> 7
    1 && 7 #=> 7
    res = 1 && a = 3 + 4
    res #=> 7

    (*) 优先表还有助于查找表达式(在链接文档中的 运算符表达式 段落中查找优先表):
    = 上面是什么在表中“形成”由 = 分配的表达式,下面没有。
    例如:
    1 + 3 and 2 + 4 #=> 4
    a = 1 + 3 and b = 2 + 4 #=> 4
    (a = 1 + 3) and (b = 2 + 4) #=> 4
    a = (1 + 3 and b = 2 + 4) #=> 6

    您还可以根据优先级表检查这些示例:
    1 && 3 #=> 3
    1 && a = 3 #=> 3
    a #=> 3

    3 and 1 #=> 3
    3 and b = 1 #=> 3
    b #=> 1

    2 ** c = 2 + 1 #=> 8
    c #=> 3

    d = 2 ** 3
    d #=> 8

    e = 3
    e **= 2
    e #=> 9

    关于ruby - 赋值运算符真的是 "just"运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63390971/

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