下面的問題,表面上看是小括號與花括號的問題。
// map方法這樣寫不能編譯通過
scala> list(2).map( case 2 => "ok" )
// 換做花括號就可以了
scala> list(2).map
不了解原因的話,覺得很詭異。分析一下,首先,map方法接受乙個函式,這個函式將list中的元素對映為其他型別。
實際上case 2 => "ok"
不是一段lambda表示式(也就是說它不是函式),它是一段模式匹配語句。
那為什麼在第二行可以編譯通過呢?
稍微有點基礎的話,會清楚方法的花括號有2種意思:
1)scala中函式的小括號,可以用花括號來表示,即foo
與foo(xx)
是一回事兒。
2)對於只有乙個引數的方法,其小括號是可以省略的,map(lambda)
可寫為map lambda
,即這塊連同花括號整體是乙個lambda(函式字面量)。
這兒顯然是第2個(追究原因就要看編譯器在語法解析式的優先順序了,看樣子把花括號對待為lambda字面量的一部分要高於把花括號當作小括號來對待),那麼為什麼加了花括號的就可以當作一段函式字面量?
這要引出偏函式的概念,所謂偏函式(也叫部分函式)與完全函式想對應,普通的方法都是完全函式,即f(i:int) = ***
是將所有int型別作為引數的,是對整個int集的對映;而偏函式則是對部分資料的對映,比如上面就僅僅只對2做了對映。偏函式的實現都是通過模式匹配來表達的。
scala> val p:partialfunction[int,string] =
因為偏函式是通過
這種特殊的方式來描述的,上面的
就被當作了一段偏函式字面量,而偏函式背後的型別partialfunction[a,b]
是繼承自function1[a,b]
的,所以將這段匿名的偏函式傳給map方法是ok的。
小結:表示式會被當作偏函式字面量。
二者還是通常意義上的定位和用法,只不過scala有一套省略策略。具體參考
**:
C 霧中風景7 閉包
本來說好要聊一聊命名空間的,因為最近在看c lambda表示式的內容,所以借這個機會我們來好好聊一聊c 的閉包。1.什麼是閉包?閉包 closure 是函式式程式設計的重要的語法結構。閉包的概念其實很簡單,一言以蔽之 閉包是帶有上下文的函式。說白了,就是有狀態的函式。也就是說乙個區域性變數n,在被函...
C 霧中風景10 聊聊左值,純右值與將亡值
1.左值與右值 左值 lvalue 和右值 rvalue 是c 型別系統之中的基礎概念,我們不需要了解這些基礎概念,同樣也能寫出 但是如果沒有弄清左右值的概念,對於許多c 高階特性的探索會一葉障目,所以筆者嘗試總結一下自己對於左值與右值的理解。在c 11之前的版本,基本沿用了c語言之中對於左值與右值...
Scala 基礎2 陣列
陣列 array arraybuffer 定長陣列 val a array int array 1,2,3,4,5 a array 1,2,3 錯誤 println a 0 a 0 10 println a 0 val a array 1,2,3,4,5 array int for x a prin...