Scala謎題 使用佔位符

2021-09-13 21:17:52 字數 1505 閱讀 4106

scala謎題

scala 特別強調要書寫簡單、簡潔的**。匿名函式的語法arg => expr,使它很容易用最小模板構建函式字面量,甚至函式由多個語句組成時也一樣可以。

用有自解釋引數的函式還可以做得更好,而且還可以用佔位符語法。佔位符語法可以省去引數宣告:

list(1, 2).map 

list(1, 2).map

以上兩個語句是等價的。但如果使用如下語句:

list(1,2).map 

list(1,2).map

會發現,它們的輸出結果不一樣:

hi

hilist[int] = list(2,3)

hilist[int] = list(2,3)

為什麼使用佔位符語法的函式與預計結構不一樣呢?因為匿名函式常常被當作引數傳遞,在**中往往會看到它們在花括號裡,就很容易認為這些花括號表示乙個匿名函式。但是,實際上它們只是界定了乙個塊表示式,乙個或多個表示式最後決定了這個塊的結果。

兩個**塊的解析方式決定了它們有不同的行為。第乙個語句被當成乙個arg => expr形式的函式字面量表示式,這裡的表示式是塊println("hi"); i + 1

第二個表示式中,**塊被認為是println("hi")_ + 1兩個表示式。當這個**塊執行的時候,將最後乙個表示式(便利性所需的函式型別,int => int)傳遞給map。其中的println語句不是函式體的一部分,它是在map的引數評估時被呼叫的,而不是作為map的一部分執行。

將剛剛那兩個函式拆分後可以很方便看出它們的區別:

scala> val printandaddone = (i: int) => 

printandaddone: int => int = scala> list(1, 2).map(printandaddone)

hihi

res29: list[int] = list(2, 3)

scala> val printandreturnafunc = 

hiprintandreturnafunc: int => int = scala> list(1, 2).map(printandreturnafunc)

res30: list[int] = list(2, 3)

scala 鼓勵簡潔的**,但太簡潔時就會出現這樣的情況。使用佔位符語法時一定要注意由它所建立的函式範圍。
這裡學到的一點是:用佔位符語法定義的匿名函式的範圍只延伸到含有下劃線_的表示式,而常規的匿名函式的函式體是包含從箭頭識別符號=>一直到**塊結束的所有**。

Scala學習之三Scala 下劃線佔位符語法

scala學習之三scala 下劃線佔位符語法 2017年8月13日12 46 11 先看例子 佔位符的理解 他們輸出的是1234567 list 1,2,3,4,5,6,7 foreach x print x list 1,2,3,4,5,6,7 foreach print list 1,2,3,...

佔位符的使用

preparestatement介面改善問題 佔位符 演示 使用statement介面物件傳送的sql語句需要在資料庫中進行一次編譯之後成為指令才能執行,每條sql語句都需要編譯一次,這樣是很慢的。使用statement介面才做的sql可以需要使用字串拼接的方式實現,這樣的方式可能存在sql注入的安...

mysql 如何使用佔位符 sql佔位符怎麼用

繫結變數是oracle解決硬解析的首要利器,能解決oltp系統中library cache的過度耗用以提高效能 繫結變數是oracle解決硬解析的首要利器,能解決oltp系統中library cache的過度耗用以提高效能。然刀子磨的太快,使起來鋒利,卻容易折斷。凡事皆有利弊二性,因地制宜,因時制宜...