2012-05-06 17 views
0

我意識到下面的函數調用都是一樣的,但我不明白爲什麼。Scala如何理解不同格式的函數調用?

val list = List(List(1), List(2, 3), List(4, 5, 6)) 

list.map(_.length) // res0 = List(1,2,3) result of 1st call 

list map(_.length) // res1 = List(1,2,3) result of 2nd call 

list map (_.length) // res2 = List(1,2,3) result of 3rd call 

我可以理解第一個呼叫,這只是一個普通的函數調用,因爲地圖是類List

的成員函數,但我不明白第二個和第三個呼叫。例如,在第三次調用中,Scala編譯器如何知道「(_.length)」是「map」的參數?編譯器如何知道「map」是「list」的成員函數?

回答

2

變體2和3之間的唯一區別是括號前的空白嗎?這隻能是一個分隔符 - list alista當然是不同的,但一個開放的parens是一個新的標記,你可以在前面放置一個空白的或兩個或三個 - 或者沒有。我看不出你在這裏會有什麼不同。

在Java中,有

System.out.println ("foo"); 

//和

System.out.println("foo"); 

也沒有什麼區別。

+0

@LuigiPlinge:哦,是的,謝謝。這是我的一個誤導性評論;刪除它。 –

0

這是操作符表示法。它的工作原因與2 + 2的工作原理是一樣的。

該空格用於區分單詞 - listmap(_.length)會使編譯器查找listmap。但如果你寫list++list,它也會起作用,list ++ list也是如此。

所以,你正在使用操作符,一個空格是必要的單詞分隔,但否則可能存在與否。