我尝试使用 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 * _ 有什么区别
最佳答案
foreach 函数的签名是:
def foreach(f: (A) => Unit): Unit
也就是说,它采用 A
类型的函数至Unit
对于某些合适的类型 A
.
所以这就是我认为正在发生的事情:
在第一个实例中,编译器解释表达式 s *= _
作为函数 f 的右侧(返回 Unit
的表达式 - 即什么都没有 - 意味着它的执行只是为了产生副作用 - 在本例中更新 s 的值)。由于该表达式中有一个下划线,编译器会为 f 假设一个合适的左侧。
在第二个实例中,编译器可以解释表达式 s = s * _
作为 f 的左侧和右侧,因此 s
的s =
应该定义类型 A
表达式的,但它不知道下划线代表什么并提示。
我还应该注意到,执行此类计算的更惯用的函数式风格是使用折叠:
scala> val s = "Hello".foldLeft(1L)(_ * _)
s: Long = 9415087488
关于scala - 为什么我在 StringOps.foreach 中的表达式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19181964/