Ruby 一元运算符的运算符优先级
一些关于运算符优先级的信息源说一元运算符像Ruby 一元运算符的运算符优先级,ruby,variable-assignment,operator-precedence,unary-operator,Ruby,Variable Assignment,Operator Precedence,Unary Operator,一些关于运算符优先级的信息源说一元运算符像,~,+,-的优先级高于赋值=。但是,以下表达式是可能的: !a = true # => false (with warning) a # => true ~a = 1 # => -2 a # => 1 +a = 1 # => 1 a # => 1 -a = 1 # => -1 a # => 1 考虑到这些结果,我能想
代码>,~
,+
,-
的优先级高于赋值=
。但是,以下表达式是可能的:
!a = true # => false (with warning)
a # => true
~a = 1 # => -2
a # => 1
+a = 1 # => 1
a # => 1
-a = 1 # => -1
a # => 1
考虑到这些结果,我能想到的唯一可能的解释是,这些一元运算符的优先级低于赋值。如果是这样,那就意味着我上面提到的信息是错误的。哪个是正确的?有不同的解释吗?我的ruby编程书(第二版)也列出了一元运算符的优先级高于赋值
一元运算符的优先级最高。将该行解析为~(a=1)的原因是,将该行分解为有效语法的优先级高于任何其他语法,包括使用简单变量“a”作为一元运算符操作的表达式
如果ruby解析器能够使行的其余部分有效,那么它会使用(~a),但是没有比matches=something更有效的规则,只有左值'='右值
您可以将“有效语法”视为最高优先级,然后是简单值、常量和变量名,然后是其下的标准运算符。有趣的是,这种行为非常有意义,因为在赋值之前对左值应用一元运算符不会有任何效果。当然,文档应该解决这个问题。@CarySwoveland你是对的。~a=1
的行为看起来像~(a=1)
。我认为你是对的。事实上,我也是这么想的。但是,一元运算符比赋值运算符具有更高的优先级,这句话什么时候会变得非常重要呢?有没有一个例子,两个优先解释是有效的,而这个规则起作用了?我想不出一种情况,赋值和任何一元运算符之间会有歧义,因为a。一元运算符产生表达式b。一元运算符对其右侧的单个表达式c进行操作。表达式不能用作赋值和d的左边。赋值中使用的唯一表达式是右侧的单个表达式。二元运算符是不同的,例如a=3和b=4与a=3&&b=4产生不同的结果(因为and的优先级比赋值低,&&D的优先级高)。我很好奇是否有人能发明一个反例——我的直觉说这可能是一种更容易解释为什么我认为我是对的而不是意识到我错了的情况;)我发现了一个有用的ruby解析器gem:-它将输出表达式的解析方式。