为什么我在StringOps.foreach中的表达式不正确

时间:2013-10-04 13:05:43

标签: scala

我尝试使用foreach来计算String的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 * _

之间的区别是什么

1 个答案:

答案 0 :(得分:3)

foreach函数的签名是:

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

也就是说,对于某些合适的类型A,它需要从Unit类型到A的函数。

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

在第一个实例中,编译器将表达式s *= _解释为函数f的右侧(表达式返回Unit - 即没有 - 意味着它仅在其侧面执行 - 效果 - 在这种情况下更新s)的值。由于此表达式中有下划线,因此编译器会为f。

采用合适的左侧

在第二个实例中,编译器可以将表达式s = s * _解释为f的左侧和右侧,因此s的{​​{1}}应该定义类型{{1表达式,但它不知道下划线代表什么和抱怨。

我还应该注意,执行这种计算的更惯用,更实用的方式是使用折叠:

s =