update: 當帶有括號并包括1到多個參數進行賦值時,編譯器將使用對象的update方法對“括號里的參數和等號右側的值”履行調用
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100
val bobsScore = scores("Bob")
以上3行代碼,我們創建了1個可變的map來存儲得分情況,然后我們記錄了Bob的得分是100分,最后我們又把Bob的分數取出來了。
這3行代碼看似平淡無奇,實則隱藏了1點點玄機。
第2行實際是調用了HashMap的update方法。
第3行實際是調用了HashMap的apply方法。
我們可以把上面的代碼改寫成下面的等價情勢:
val scores = new scala.collection.mutable.HashMap[String, Int]
scores.update("Bob", 100)
val bobsScore = scores.apply("Bob”)
class SomeClass {
defupdate(arg1:Int, arg2:String, arg3:String):String ={
println("update method called")
arg1+ "|"+ arg2+ "|"+ arg3
}
}
val obj =new SomeClass
val result =(obj(1,"key1")="Hello")
println(result)
履行后輸出結果為:
update method called
1|key1|Hello
利用 update 時,等號右側的值會作為 update 方法的最后1個參數。
update方法的適用處:
class AddressChanger {
def update(name: String, age: Int, newAddress: String) = {
println(s"changing address of $name, whose age is $age to $newAddress")
//actually change the address
}
}
我們可以這樣來調用它:
val changer = new AddressChanger()
changer.update("xiao ming", 23, "beijing")
或,我們也能夠這樣來調用它:
val addressOf = new AddressChanger()
addressOf(name = "xiao ming", age = 23) = "beijing"
結果:
changing address of xiao ming, whose age is 23 to beijing
這兩段代碼是等價的。
比較1下,前1種用法顯得中規中矩,沒甚么特別好的,也沒啥特大的毛病。
可是后1種用法就不同了,讀起來很通順,有讀英語語句的感覺:把名字叫做小明,年齡23歲的人的地址改成北京。
如果再給AddressChanger加上1個apply方法,我們還可以寫這樣的代碼:
val currentAddress = addressOf(name = "xiao ming", age = 23)
這樣,讀取和更新的代碼都看起來非常自然。
如果我們把這兩段代碼連起來看:
val currentAddress = addressOf(name = "xiao ming", age = 23)
addressOf(name = "xiao ming", age = 23) = "beijing"
感覺甚好。
addressOf(name = “xiao ming”, age = 23)可以看作1個整體,它就猶如1個可讀可寫的屬性。
我們把它放到賦值語句的右邊,就可以取到小明確當前住址。
我們把它放到賦值語句的左邊,就可以修改小明的住址。
apply和update都是蠻簡單的語言特性,但是加以適合的利用,卻能得到可讀性極強的代碼。