我尝试使用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 * _
之间的区别是什么答案 0 :(得分:3)
foreach函数的签名是:
def foreach(f: (A) => Unit): Unit
也就是说,对于某些合适的类型A
,它需要从Unit
类型到A
的函数。
所以这就是我认为发生的事情:
在第一个实例中,编译器将表达式s *= _
解释为函数f的右侧(表达式返回Unit
- 即没有 - 意味着它仅在其侧面执行 - 效果 - 在这种情况下更新s)的值。由于此表达式中有下划线,因此编译器会为f。
在第二个实例中,编译器可以将表达式s = s * _
解释为f的左侧和右侧,因此s
的{{1}}应该定义类型{{1表达式,但它不知道下划线代表什么和抱怨。
我还应该注意,执行这种计算的更惯用,更实用的方式是使用折叠:
s =