W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Scala 提供了豐富的運(yùn)算符用來(lái)操作前面介紹的基本數(shù)據(jù)類型。前面說(shuō)過(guò),這些運(yùn)算符(操作符)實(shí)際為普通類方法的簡(jiǎn)化(或者稱為美化)表示。比如 1+2 ,實(shí)際為 (1).+(2) ,也就是調(diào)用 Int 類型的+方法。例如:
scala> val sumMore = (1).+(2)
sumMore: Int = 3
實(shí)際上類 Int 定義了多個(gè)+方法的重載方法(以支持不同的數(shù)據(jù)類型)比如和 Long 類型相加。+符號(hào)為一運(yùn)算符,為一中綴運(yùn)算符。 在 Scala 中你可以定義任何方法為一操作符。 比如 String 的 IndexOf 方法也可以使用操作符的語(yǔ)法來(lái)書寫。 例如:
scala> val s ="Hello, World"
s: String = Hello, World
scala> s indexOf 'o'
res0: Int = 4
由此可以看出運(yùn)算符在 Scala 中并不是什么特殊的語(yǔ)法,任何 Scala 方法都可以作為操作符來(lái)使用。是否是操作符取決于你如何使用這個(gè)方法,當(dāng)你使用 s.indexOf(‘o’) indexOf 不是一個(gè)運(yùn)算符。 而你寫成 s indexOf ‘o’ ,indexOf 就是一個(gè)操作符,因?yàn)槟闶褂昧瞬僮鞣恼Z(yǔ)法。
除了類似+的中綴運(yùn)算符(操作符在兩個(gè)操作符之間),還可以有前綴運(yùn)算符和后綴運(yùn)算符。顧名思義前綴運(yùn)算符的操作符在操作數(shù)前面,比如 -7 的“-”。后綴運(yùn)算符的運(yùn)算符在操作數(shù)的后面,比如 7 toLong 中的 toLong。 前綴和后綴操作符都使用一個(gè)操作數(shù),而中綴運(yùn)算符使用前后兩個(gè)操作數(shù)。Scala 在實(shí)現(xiàn)前綴和后綴操作符的方法,其方法名都以 unary_-開頭。比如:表達(dá)式 -2.0 實(shí)際上調(diào)用 (2.0).unary_-方法。
scala> -2.0
res1: Double = -2.0
scala> (2.0).unary_-
res2: Double = -2.0
如果你需要定義前綴方法,你只能使用+,-,! 和~四個(gè)符號(hào)作為前綴操作符。
后綴操作符在不使用.和括號(hào)調(diào)用時(shí)不帶任何參數(shù)。在 Scala 中你可以省略掉沒(méi)有參數(shù)的方法調(diào)用的空括號(hào)。按照慣例,如果你調(diào)用方法是為了利用方法的“副作用”,此時(shí)寫上空括號(hào),如果方法沒(méi)有任何副作用(沒(méi)有修改其它程序狀態(tài)),你可以省略掉括號(hào)。比如:
scala> val s ="Hello, World"
s: String = Hello, World
scala> s toLowerCase
res0: String = hello, world
具體 Scala 的基本數(shù)據(jù)類型支持的操作符,可以參考 Scala API 文檔。下面以示例介紹一些常用的操作符:
scala> 1.2 + 2.3
res0: Double = 3.5
scala> 'b' -'a'
res1: Int = 1
scala> 11 % 4
res2: Int = 3
scala> 11.0f / 4.0f
res3: Float = 2.75
scala> 2L * 3L
res4: Long = 6
scala> 1 >2
res5: Boolean = false
scala> 1.0 <= 1.0
res6: Boolean = true
scala> val thisIsBoring = !true
thisIsBoring: Boolean = false
scala> !thisIsBoring
res7: Boolean = true
scala> val toBe=true
toBe: Boolean = true
scala> val question = toBe || ! toBe
question: Boolean = true
要注意的是邏輯運(yùn)算支持“短路運(yùn)算”,比如 op1 || op2 ,當(dāng) op1=true ,op2 無(wú)需再計(jì)算,就可以知道結(jié)果為 true。這時(shí) op2 表示式不會(huì)執(zhí)行。例如:
scala> def salt()= { println("salt");false}
salt: ()Boolean
scala> def pepper() ={println("pepper");true}
pepper: ()Boolean
scala> pepper() && salt()
pepper
salt
res0: Boolean = false
scala> salt() && pepper()
salt
res1: Boolean = false
scala> 1 & 2
res2: Int = 0
scala> 1 | 2
res3: Int = 3
scala> 1 ^ 2
res4: Int = 3
scala> ~1
res5: Int = -2
如果需要比較兩個(gè)對(duì)象是否相等,可以使用==和!=操作符
scala> 1 == 2
res6: Boolean = false
scala> 1 !=2
res7: Boolean = true
scala> List(1,2,3) == List (1,2,3)
res8: Boolean = true
scala> ("he"+"llo") == "hello"
res9: Boolean = true
Scala 的==和 Java 不同,scala 的==只用于比較兩個(gè)對(duì)象的值是否相同。而對(duì)于引用類型的比較使用另外的操作符 eq 和 ne。
Scala 的操作符的優(yōu)先級(jí)和 Java 基本相同,如果有困惑時(shí),可以使用()改變操作符的優(yōu)先級(jí)。 操作符一般為左結(jié)合,Scala 規(guī)定了操作符的結(jié)合性由操作符的最后一個(gè)字符定義。對(duì)于以“:”結(jié)尾的操作符都是右結(jié)合,其它的操作符多是左結(jié)合。例如:
ab 為 a.(b) 而 a:::b 為 b.:::(a),而 a:::b:::c = a::: (b ::: c) , abc= (ab)c
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: