占位符语法不能保留我的位置

som*_*ytt 2 scala

我已经阅读了一些其他问题,例如Scala中下划线的所有用途是什么?虽然我确信这个问题已被提出,但我无法解决所有其他17000个Scala问题.

有一个Foreach有奇怪的行为,占位符没用,但它似乎仍然是一个隐藏的功能:

scala> val is = (1 to 5) toList
is: List[Int] = List(1, 2, 3, 4, 5)

scala> is foreach { i => println("Hi.") ; Console println 2 * i }
Hi.
2
Hi.
4
Hi.
6
Hi.
8
Hi.
10

scala> is foreach { println("Hi.") ; Console println 2 * _ }
Hi.
2
4
6
8
10
Run Code Online (Sandbox Code Playgroud)

请有人解释一下我的区别吗?

如果你感到一阵热情并尝试:

scala> is foreach { i => println("Hi!") ; Console println 2 * i }
java.lang.IllegalArgumentException: !") ; Console println 2 * i }: event not found
Run Code Online (Sandbox Code Playgroud)

然后看到这个答案. 是的,真的发生了.

Lan*_*dei 7

占位符语法适用于一个表达式,而不适用于整个块,因此您的示例被解释为 { println("Hi."); i => Console println 2 * i }