斯卡拉的"Hello" foreach (x = x * _.toLong)
和"Hello" foreach (x *= _.toLong)
有何区别?scala中的“Hello”foreach(x = x * _.toLong)和“Hello”foreach(x * = _.toLong)有什么区别?
不起作用:
scala> var x : Long = 1
x: Long = 1
scala> "Hello" foreach (x = x * _.toLong)
<console>:13: error: missing parameter type for expanded function ((x$1) => x.$times(x$1.toLong))
"Hello" foreach (x = x * _.toLong)
作品:
scala> "Hello" foreach (x *= _.toLong)
scala> xbtebh
res89: Long = 9415087488
“另请注意,使用副作用和可变值是Scala中的一大难题。” - 这不是真的。 Scala是一种不纯的对象功能语言。你可以愉快地在各处放置副作用,并且类型检查器不会抱怨。 –
我不是说类型检查会抱怨。我只是说,特别是因为它是允许的,它可能导致设计不好,并且不鼓励。如果斯卡拉不是不纯,我的评论将毫无意义,因为语言本身不会允许它。 – slouc
当语言的基础基础允许副作用和变异时,那么你的陈述并不完全正确。即使Odersky本人也记录在案,表明他不是纯粹功能性编程的粉丝(这就是你的陈述所指的),并推出了一个更加宽松的“功能性编程”版本。在我看来,尝试遵守惯例的纯洁性是一场艰苦的战斗,Scala通过不擅长的方式在这里推销某些东西。 –