2010-05-27 203 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