{_ =>是什么意思或用途和scala中的_ = somefunctionname()

时间:2018-02-13 13:01:36

标签: scala functional-programming

在问题中,为什么人们在scala中以最混乱的方式编写代码,如

    _ = function1(arg1, arg2)

    anObject.method(arg1, arg2) { _ => } 

我无法理解它的作用。

1 个答案:

答案 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