2010-05-27 156 views
39

我喜欢Scala对运算符优先级的建议,但在一些极少数情况下,未修改的规则可能不方便,因为您在命名方法时有限制。有没有方法在Scala中为类/文件等定义另一个规则?如果没有,将来会解决吗?Scala中的运算符优先级

+3

相关邮件列表主题:http://scala-programming-language.1934581.n4.nabble.com/More-unicode-alternatives-for-ASCII-operators-td2008146.html – retronym 2010-05-27 19:53:29

回答

91

操作员的优先级在Scala Reference - 6.12.3 Infix Operations中由操作员的第一个字符固定。按优先级递增顺序列出:

(all letters) 
| 
^ 
& 
= ! 
< > 
: 
+ - 
*/% 
(all other special characters) 

而且它不太可能会改变。它可能会产生比修复更多的问题。如果使用正常运算符优先级,则将其更改为一个类将会相当混乱。

+5

@huynhjl来自引用的参考文献:“这个规则有一个例外,它涉及到赋值运算符(§6.12.4)。赋值运算符的优先级与简单赋值(=)的优先级相同,也就是说,它低于任何其他运算符的优先级“。 §6.12.4将分配操作符描述为以“=”结尾的操作符。所以上面的列表是不完整的,而不是不正确的。 – 2011-09-29 14:35:16

+6

@Luigi Plinge,'==='不是赋值运算符,因为有一个例外:以'='结尾的运算符是赋值运算符*,除非运算符也以等号字符*开头。看看这个人道主义的线索和另一个环节,Martin本人表示SLS需要更新。我看不到更新。 – huynhjl 2011-09-29 15:14:04

+1

我认为决定让所有字母成为最弱的一个是奇怪的:'a contains b || c包含d',我认为这是一个频繁的构造,需要括号...... – 2014-02-16 23:23:58

7

没有这种能力,在可预见的未来几乎没有可能性。

0

未修改规则可能是不方便的,因为你在命名你的方法

  • 你没有命名你的方法的任何限制有限制。例如,您可以为类定义方法+, - ,*等。
  • 我们还必须遵循Thomas Jung先前回答(https://stackoverflow.com/a/2922456)中提到的事实上的“未经修改的规则”(由Scala运算符优先规则强制执行) - 这对许多(如果不是所有的)编程语言和抽象代数是很常见的;我们不需要重新定义a + b * c的运算符优先级。

有关“Rational”类示例,请参阅书http://www.scala-lang.org/docu/files/ScalaByExample.pdf的第6章。

+0

“命名你的方法的限制”我的意思是,如果,例如,你认为'+'是你的方法的完美名称,可能会因为不可修改的优先级而被迫选择另一个名称。 – Jeriho 2017-04-27 22:08:47

+1

并非所有的编程语言都具有不可修改的运算符优先级。看看haskell的infix/infixr/infixl命令。 – Jeriho 2017-04-27 22:13:45