在问题中,为什么人们在scala中以最混乱的方式编写代码,如
_ = function1(arg1, arg2)
和
anObject.method(arg1, arg2) { _ => }
我无法理解它的作用。
答案 0 :(得分:14)
第一个问题与monadic风格有关。在for
内部 - 理解中,不可能简单地调用函数。
for {
x <- getList // <- I don't need this x!
y = func(42)
println(y) // <- I cannot do this!
} yield y
但是,有时候,您对结果不感兴趣,因此不想给它起个名字。
至少Scala允许您使用下划线放弃这些结果:
for {
_ <- getList // <- somewhat better
y = func(42)
_ = println(y) // <- somewhat dumb, but better than not being able to
} yield y
Scala还允许您在对函数的参数不感兴趣时使用下划线,例如:
List.tabulate(3, 3)((x, _) => x) // we omitted second argument
生成3x3列表,所有行具有相同的数字
List(
List(0, 0, 0),
List(1, 1, 1),
List(2, 2, 2)
)
最后,一个没有语句的块被认为是一个返回Unit
的块(在java中类似void
)
作为一个不太抽象的例子,你可以考虑一个在评估时做某事的迭代器:
val it = Iterator.from(1).map(x => { println(s"x is $x"); x }).take(3)
迭代器是懒惰的,所以在我们将其转换为集合或调用foreach
之前不会发生任何事情。如果我们只关心副作用,可以写:
it.foreach { _ => }
只有在看到此输出后:
x is 1
x is 2
x is 3