成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala操作符的優先級和關聯性

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第五章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

操作符的優先級決定了表達式的哪個部分先于其他部分被評估。舉例來說,表達式2 + 2 * 7計算得16,而不是28,因為*操作符比+操作符有更高的優先級。因此表達式的乘法部分先于加法部分被評估。當然你還可以在表達式里使用括號來厘清評估次序或覆蓋優先級。例如,如果你實際上希望上面表達式的值是28,你可以這么寫表達式:

51CTO編輯推薦:Scala編程語言專題

  1. (2 + 2) * 7 

由于Scala沒有操作符,實際上,是以操作符的格式使用方法的一個途徑,你或許想知道操作符優先級是怎么做到的。Scala基于操作符格式里方法的第一個字符決定優先級(這個規則有一個例外,稍后再說)。比方說,如果方法名開始于*,那么就比開始于+的方法有更高的優先級。因此2 + 2 * 7將被評估為2 + (2 * 7),而a +++ b *** c(這里a,b和c是值或變量,而+++和***是方法)將被看作是a +++ (b *** c),因為***方法比+++方法有更高的優先級。

表格 5.3 操作符優先級

操作符優先級 

表格5.3以降序方式展示了根據方法第一個字符指定的優先級,同一行的字符具有同樣的優先級。表格中字符的位置越高,以這個字符開始的方法具有的優先級就越高。舉例如下:

  1. scala> 2 << 2 + 2 
  2. res41: Int = 32 
<<方法開始于字符<,在表格5.3里的位置比+(+方法的第一個也是唯一的一個字符)要低。因此<<比+的優先級低,表達式也要在先調用了+方法之后再調用<<方法,如2 << (2 + 2)。我們可以算一下,2 + 2得4,2 << 4得32。下面給出另一個例子:

  1. scala> 2 + 2 << 2 
  2. res42: Int = 16 
由于第一個字符與前面的例子里一樣,因此調用的方法順序也沒有不同。首先+方法被調用,然后是<<方法。因此2 + 2得4,4 << 2得16。

上面提到的優先級規則的一個例外,有關于以等號結束的賦值操作符:assignment operator。如果操作符以等號字符(=)結束,且操作符并非比較操作符<=,>=,==,或=,那么這個操作符的優先級與賦值符(=)相同。也就是說,它比任何其他操作符的優先級都低。例如:

  1. x *= y + 1 
與下面的相同:

  1. x *= (y + 1)  
因為*=被當作賦值操作符,它的優先級低于+,盡管操作符的第一個字符是*,似乎其優先級高于+。

當同樣優先級的多個操作符肩并肩地出現在表達式里,操作符的關聯性:associativity決定了操作符分組的方式。Scala里操作符的關聯性取決于它的最后一個字符。正如第3章里47頁提到的,任何以‘:’字符結尾的方法由它的右手側操作數調用,并傳入左操作數。以其他字符結尾的方法有其他的說法。它們都是被左操作數調用,并傳入右操作數。因此a * b變成a.*(b),但是a:::b變成b.:::(a)。然而,不論操作符具有什么樣的關聯性,它的操作數總是從左到右評估的。因此如果b是一個表達式而不僅僅是一個不可變值的指針的話,那么更精確的意義上說,a:::b將會當作是:

  1. { val x = a; b.:::(x) } 

這個代碼塊中,a仍然在b之前被評估,然后評估結果被當作操作數傳給b的:::方法。

這種關聯性規則在同時使用多個具有同優先級的操作符時也會起作用。如果方法結束于:,它們就被自右向左分組;反過來,就是自左向右分組。例如,a ::: b ::: c會被當作a ::: (b ::: c)。而a * b * c被當作(a * b) * c。

操作符優先級也是Scala語言的一部分。你不用怕它。但無論如何,使用括號去厘清什么操作符作用在哪個表達式上都是好的風格。或許你唯一可以確信其他人不用查書就知道的優先級關系就是乘除法操作符(*,/和%),比加減法(+和-)的要高。因此即使a + b << c不用括號也能產生你想要的結果,寫成(a + b) << c而得到的簡潔性也可能會減少你的同事為了表示不滿在操作符注釋里寫你名字的頻率,“bills!*&^%~code!” 到目前為止,你應該能指出給出的這段代碼,Scala編譯器會調用成(bills.!*&^%~(code)).!()。

【相關閱讀】

  1. Scala對象的相等性比較
  2. Scala的數學運算、關系和邏輯操作及位操作符
  3. Scala的操作符:任何方法都可以是操作符
  4. Scala的基本類型及文本化
  5. Scala程序及其Application特質

責任編輯:book05 來源: Artima
相關推薦

2009-07-21 12:47:04

Scala私有字段定義操作符

2013-05-28 13:44:01

Java下一代

2009-07-21 09:31:00

Scala操作符

2018-01-05 16:07:49

VM-VMVM-host規則

2009-07-21 09:31:00

Scala數學運算邏輯操作位操作符

2015-08-18 14:47:10

大數據

2009-08-12 13:07:13

C#運算符優先級

2009-12-11 10:43:00

Scala講座操作符函數

2010-07-14 14:55:07

Perl操作符

2011-03-14 10:17:40

JavaScript

2010-09-06 14:53:27

CSS優先級

2012-08-14 09:38:29

WAN優化

2010-09-01 14:10:36

CSS優先級

2022-12-23 09:41:14

優先級反轉

2021-10-31 18:59:55

Python操作符用法

2009-08-19 17:26:28

C# 操作符

2021-04-06 10:45:18

React前端優先級

2010-03-18 14:09:20

Java線程同步

2020-09-30 09:07:37

DevOps

2009-07-14 18:34:22

Jython操作符重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97免费在线观看视频 | 日韩美女一区二区三区在线观看 | 一区二区三区四区免费观看 | 亚洲欧美日韩国产综合 | 久久一| 欧美日韩综合 | 国户精品久久久久久久久久久不卡 | 激情小视频 | 97精品超碰一区二区三区 | 欧美一区二区免费视频 | 一本一道久久a久久精品综合蜜臀 | 国产在线精品一区二区 | 久久高潮| 成人在线视频免费观看 | 欧美区在线 | 视频一二三区 | 精品一区二区三区四区 | 五月激情婷婷在线 | 中文字幕国产 | 精品九九| 鲁大师一区影视 | 国产一级毛片精品完整视频版 | 欧美黄色一区 | 黑人久久久 | 国产一区三区在线 | 久久国产精品72免费观看 | 国产成人99久久亚洲综合精品 | 人人澡人人射 | 国产一区二区在线免费观看 | 亚洲精品乱码久久久久久黑人 | 欧美一区二区大片 | 一区二区免费在线观看 | 欧美一区二区三区在线播放 | 亚洲综合色网站 | 欧洲在线视频 | av片在线播放 | 成人不卡一区二区 | 久久青| 久久福利电影 | 中文字幕久久久 | 欧洲亚洲精品久久久久 |