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

Scala的操作符:任何方法都可以是操作符

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

Scala為它的基本類型提供了豐富的操作符集。這些操作符實際只是作用在普通方法調用上華麗的語法。例如,1 + 2與(1).+(2)其實是一回事。換句話說,就是Int類包含了叫做+的方法,它帶一個Int參數并返回一個Int結果。這個+方法在兩個Int相加時被調用:

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

  1. scala> val sum = 1 + 2 // Scala調用了(1).+(2)  
  2. sum: Int = 3 
想要證實這點,可以把表達式顯式地寫成方法調用:

  1. scala> val sumMore = (1).+(2)  
  2. sumMore: Int = 3 
而真正的事實是,Int包含了許多帶不同的參數類型的重載:overload的+方法。重載的方法有同樣的名稱和不同的參數類型。例如,Int還有另一個也叫+的方法參數和返回類型為Long。如果你把Long加到Int上,這個替換的+方法就將被調用:

  1. scala> val longSum = 1 + 2L // Scala調用了(1).+(2L)  
  2. longSum: Long = 3 
符號+是操作符——更明確地說,是中綴操作符。操作符標注不僅限于像+這種其他語言里看上去像操作符一樣的東西。你可以把任何方法都當作操作符來標注。例如,類String有一個方法indexOf帶一個Char參數。indexOf方法搜索String里***次出現的指定字符,并返回它的索引或-1如果沒有找到。你可以把indexOf當作中綴操作符使用,就像這樣:

  1. scala> val s = "Hello, world!" 
  2. s: java.lang.String = Hello, world!  
  3. scala> s indexOf 'o' // Scala調用了s.indexOf(’o’)  
  4. res0: Int = 4 
另外,String提供一個重載的indexOf方法,帶兩個參數,分別是要搜索的字符和從哪個索引開始搜索。(前一個indexOf方法開始于索引零,也就是String開始的地方。)盡管這個indexOf方法帶兩個參數,你仍然可以用操作符標注的方式使用它。不過當你用操作符標注方式調用帶多個參數的方法時,這些參數必須放在括號內。例如,以下是如何把另一種形式的indexOf當作操作符使用的例子(接前例):

  1. scala> s indexOf ('o'5// Scala調用了s.indexOf(’o’, 5)  
  2. res1: Int = 8 
任何方法都可以是操作符

Scala里的操作符不是特殊的語言語法:任何方法都可以是操作符。使用方法的方式使它成為操作符。如果寫成s.indexOf('o'),indexOf就不是操作符。不過如果寫成,s indexOf 'o',那么indexOf就是操作符了,因為你以操作符標注方式使用它。

目前為止,你已經看到了中綴:infix操作符標注的例子,也就是說調用的方法位于對象和傳遞給方法的參數或若干參數之間,如“7 + 2”。Scala還有另外兩種操作符標注:前綴和后綴。前綴標注中,方法名被放在調用的對象之前,如,-7里的‘-’。后綴標注中,方法放在對象之后,如,“7 toLong”里的“toLong”。

與中綴操作符——操作符帶后兩個操作數,一個在左一個在右——相反,前綴和后綴操作符都是一元:unary的:它們僅帶一個操作數。前綴方式中,操作數在操作符的右邊。前綴操作符的例子有-2.0,!found和~0xFF。與中綴操作符一致,這些前綴操作符是在值類型對象上調用方法的簡寫方式。然而這種情況下,方法名在操作符字符上前綴了“unary_”。例如,Scala會把表達式-2.0轉換成方法調用“(2.0).unary_-”。你可以輸入通過操作符和顯式方法名兩種方式對方法的調用來演示這一點:

  1. scala> -2.0             // Scala調用了(2.0).unary_-  
  2. res2: Double = -2.0 
  3. scala> (2.0).unary_-  
  4. res3: Double = -2.0 
可以當作前綴操作符用的標識符只有+,-,!和~。因此,如果你定義了名為unary_!的方法,就可以像!p這樣在合適的類型值或變量上用前綴操作符方式調用這個方法。但是如果你定義了名為unary_*的方法,就沒辦法用成前綴操作符了,因為*不是四種可以當作前綴操作符用的標識符之一。你可以像平常那用調用它,如p.unary_*,但如果嘗試像*p這么調用,Scala就會把它理解為*.p,這或許就不會是你想當然的了!然而,不是一點兒希望都沒有。仍然有極微弱的機會,讓你的帶有*p的程序或許能像C++那樣被編譯。

后綴操作符是不用點或括號調用的不帶任何參數的方法。Scala里,你可以舍棄方法調用的空括號。例外就是如果方法帶有副作用就加上括號,如println(),不過如果方法沒有副作用就可以去掉括號,如String上調用的toLowerCase:

  1. scala> val s = "Hello, world!" 
  2. s: java.lang.String = Hello, world!  
  3. scala> s.toLowerCase  
  4. res4: java.lang.String = hello, world!  
后面的這個例子里,方法沒帶參數,或者還可以去掉點,采用后綴操作符標注方式:

  1. scala> s toLowerCase  
  2. res5: java.lang.String = hello, world!  
例子里,toLowerCase被當作操作數s上的后綴操作符。

因此要想知道Scala的值類型里你可以用哪些操作符,所有需要做的就是在Scala的API文檔里查詢定義在值類型上的方法。

【相關閱讀】

  1. Scala的基本類型及文本化
  2. Scala程序及其Application特質
  3. Scala程序中的分號推斷和Singleton對象
  4. 學習Scala類的定義,字段和方法
  5. 學習Scala腳本:從文件里讀取行記錄
責任編輯:book05 來源: Artima
相關推薦

2009-07-21 12:47:04

Scala私有字段定義操作符

2021-10-31 18:59:55

Python操作符用法

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2011-04-08 16:26:14

JavaScript

2010-07-14 14:30:31

Perl操作符

2010-07-19 11:00:24

Perl操作符

2009-09-15 17:16:58

LINQ查詢操作符

2012-02-06 09:13:23

LINQ

2009-09-16 09:09:23

Linq Contai

2010-07-14 14:18:51

Perl操作符

2009-12-11 10:43:00

Scala講座操作符函數

2009-07-14 18:34:22

Jython操作符重載

2010-07-13 11:11:39

Perl標量

2009-11-30 16:48:08

PHP操作符

2010-01-28 11:16:28

C++操作符

2009-07-21 09:31:00

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

2009-07-21 08:41:05

Scala操作符優先級

2016-12-28 09:54:50

AndroidRxJava操作符

2017-01-03 16:12:13

RxJava操作符Android
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区av| 黄色网页在线观看 | 日本一区二区三区在线观看 | 亚洲精品久久久久久久久久久 | 亚洲国产一区在线 | 久久久久久久久久一区二区 | 成人不卡| 91免费观看视频 | www.天天操 | 乱码av午夜噜噜噜噜动漫 | www在线| 麻豆一区一区三区四区 | 日韩欧美亚洲 | 欧美在线观看一区 | 欧美成人免费 | 国产精品久久久久久久久久久久久 | 欧美日韩免费 | 天天插天天狠天天透 | 成人三级网址 | 国产有码| 天堂中文在线观看 | 亚洲区一区二 | 国产精品成人一区二区三区夜夜夜 | 国产精品1区2区 | 偷拍自拍在线观看 | 91精品国产91久久综合桃花 | 欧美高清性xxxxhd | 日日干日日操 | 日韩三区在线 | 91久久久久久久久久久久久 | 国产不卡在线观看 | 亚洲成av人影片在线观看 | 国产成人久久精品一区二区三区 | 国产视频一区在线观看 | 亚洲国产视频一区 | 日韩精品区| 午夜视频在线免费观看 | 国产精品久久久久久久久动漫 | 欧美日韩在线一区二区三区 | 亚洲日产精品 | 欧美精品一区免费 |