为什么使用下划线使这个列表理解只打印一个点?

noa*_*hlz 1 scala

在Scala 2.9.2中

List(List(1,5,4),List(7,9,11)).flatten.map {i => println(i); identity(i) }.find { _ % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)

打印:

1
5
4
7
9
11
Option[Int] = Some(4)
Run Code Online (Sandbox Code Playgroud)

List(List(1,5,4),List(7,9,11)).flatten.map { println("."); identity(_) }.find { _ % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)

打印

.
Option[Int] = Some(4)
Run Code Online (Sandbox Code Playgroud)

我必须承认,我对这种行为感到有些惊讶.Underscore似乎不仅仅是等效内联函数的简写,而是对代码有其他影响.这里发生了什么?

Fre*_*Foo 7

{ println("."); identity(_) }
Run Code Online (Sandbox Code Playgroud)

不是打印点并返回标识的函数.它是一个代码块,在计算表达式时执行一次,打印一个点,然后返回该函数identity(_),该函数又映射到展平列表上.

  • 这种解释并不完全正确.`{println("."); identity(_)}`包含一个函数,实际上它是对`{println(".")的贬低; x => identity(x)}`.这意味着为列表的所有值调用标识函数. (2认同)