2013-10-04 24 views
2

我嘗試使用foreach來計算String的Unicode值的乘積。爲什麼我在StringOps.foreach中的表達式不正確

scala> var s:Long = 1;"Hello".foreach(s *= _) 
s: Long = 9415087488 

scala> var s:Long = 1;"Hello".foreach(s = s * _) 
<console>:10: error: missing parameter type for expanded function ((x$1) => s.$times(x$1)) 
     "Hello".foreach(s = s * _) 
          ^

我不知道爲什麼S = S * _是不正確的在這裏,什麼是* = _和s = S * _

回答

3

對foreach函數簽名S的區別是:

def foreach(f: (A) => Unit): Unit 

也就是說,對於某些合適的類型A,它需要從A類型到Unit的函數。

所以這是什麼,我相信正在發生的事情:

在第一種情況下,編譯器表達s *= _作爲函數f的右側(返回Unit的表達 - 即什麼 - 這意味着它是隻執行其副作用 - 在這種情況下更新s的值)。由於該表達式中有一個下劃線,因此編譯器假定適合f的左側。

在第二種情況下,編譯器可以解釋表達s = s * _爲f的左,右手兩側,所以s =s應該定義表達式的A類型,但後來不知道什麼下劃線表示和抱怨。

我也應該注意到,在執行這種計算的更地道,實用的風格是使用摺疊:

scala> val s = "Hello".foldLeft(1L)(_ * _) 
s: Long = 9415087488 
相關問題