Scala:函數(shù)文本的短格式和占位符語法
函數(shù)文本的短格式
Scala提供了許多方法去除冗余信息并把函數(shù)文本寫得更簡短。注意留意這些機會,因為它們能讓你去掉代碼里亂七八糟的東西。
51CTO編輯推薦:Scala編程語言專題
一種讓函數(shù)文本更簡短的方式是去除參數(shù)類型。因此,前面帶過濾器的例子可以寫成這樣:
Scala編譯器知道x一定是整數(shù),因為它看到你立刻使用了這個函數(shù)過濾整數(shù)列表(由someNumbers暗示)。這被稱為目標類型化:target typing,因為表達式的目標使用——本例中someNumbers.filter()的參數(shù)——影響了表達式的類型化——本例中決定了x參數(shù)的類型。目標類型化的精確細節(jié)并不重要。你可以簡單地從編寫一個不帶參數(shù)類型的函數(shù)文本開始,并且,如果編譯器不能識別,再加上類型。幾次之后你就對什么情況編譯器能或不能解開謎題有感覺了。
- scala> someNumbers.filter((x) => x > 0)
- res7: List[Int] = List(5, 10)
第二種去除無用字符的方式是省略類型是被推斷的參數(shù)之外的括號。前面例子里,x兩邊的括號不是必須的:
占位符語法
- scala> someNumbers.filter(x => x > 0)
- res8: List[Int] = List(5, 10)
如果想讓函數(shù)文本更簡潔,可以把下劃線當做一個或更多參數(shù)的占位符,只要每個參數(shù)在函數(shù)文本內(nèi)僅出現(xiàn)一次。比如,_ > 0對于檢查值是否大于零的函數(shù)來說就是非常短的標注:
你可以把下劃線看作表達式里需要被“填入”的“空白”。這個空白在每次函數(shù)被調(diào)用的時候用函數(shù)的參數(shù)填入。例如,由于someNumbers在第113頁被初始化為值List(-11, -10, -5, 0, 5, 10),filter方法會把_ > 0里的空格首先用-11替換,就如-11 > 0,然后用-10替換,如-10 > 0,然后用-5,如-5 > 0,這樣直到List的***一個值。因此,函數(shù)文本_ > 0與稍微冗長一點兒的x => x > 0相同,演示如下:
- scala> someNumbers.filter(_ > 0)
- res9: List[Int] = List(5, 10)
有時你把下劃線當作參數(shù)的占位符時,編譯器有可能沒有足夠的信息推斷缺失的參數(shù)類型。例如,假設你只是寫_ + _:
- scala> someNumbers.filter(x => x > 0)
- res10: List[Int] = List(5, 10)
這種情況下,你可以使用冒號指定類型,如下:
- scala> val f = _ + _
- < console>:4: error: missing parameter type for expanded
- function ((x$1, x$2) => x$1.$plus(x$2))
- val f = _ + _
- ˆ
- scala> val f = (_: Int) + (_: Int)
- f: (Int, Int) => Int = < function>
- scala> f(5, 10)
- res11: Int = 15
請注意_ + _將擴展成帶兩個參數(shù)的函數(shù)文本。這也是僅當每個參數(shù)在函數(shù)文本中最多出現(xiàn)一次的情況下你才能使用這種短格式的原因。多個下劃線指代多個參數(shù),而不是單個參數(shù)的重復使用。***個下劃線代表***個參數(shù),第二個下劃線代表第二個,第三個……,如此類推。
【相關閱讀】