2

我尝试使用 foreach 计算字符串的 unicode 值的乘积。

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 = s * _ 有什么区别

4

1 回答 1

3

foreach 函数的签名是:

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

也就是说,它需要一个函数从 typeAUnit某个适当的 type A

所以这就是我认为正在发生的事情:

在第一种情况下,编译器将表达式解释s *= _为函数 f 的右侧(一个返回的表达式Unit- 即什么都没有 - 意味着它只是为了它的副作用而执行 - 在这种情况下更新 s 的值)。因为这个表达式中有一个下划线,所以编译器假定 f 有一个合适的左侧。

在第二种情况下,编译器可以将表达式解释s = s * _为 f 的左侧和右侧,因此sofs =应该定义A表达式的类型,但是它不知道下划线代表什么并抱怨。

我还应该注意,执行此类计算的更惯用、更实用的风格是使用折叠:

scala> val s = "Hello".foldLeft(1L)(_ * _)
s: Long = 9415087488
于 2013-10-04T13:26:29.433 回答