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的過度耗用以提高效能。然刀子磨的太快,使起來鋒利,卻容易折斷。凡事皆有利弊二性,因地制宜,因時制宜...