scala霧中風景 2 小括號與花括號

2021-07-22 03:02:57 字數 1168 閱讀 4859

下面的問題,表面上看是小括號與花括號的問題。

// map方法這樣寫不能編譯通過

scala> list(2).map( case 2 => "ok" )

// 換做花括號就可以了

scala> list(2).map

不了解原因的話,覺得很詭異。分析一下,首先,map方法接受乙個函式,這個函式將list中的元素對映為其他型別。

實際上case 2 => "ok"不是一段lambda表示式(也就是說它不是函式),它是一段模式匹配語句。

那為什麼在第二行可以編譯通過呢?

稍微有點基礎的話,會清楚方法的花括號有2種意思:

1)scala中函式的小括號,可以用花括號來表示,即foofoo(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...