在Scala中应用和lambdas

Yar*_*lav 3 lambda scala apply

我有以下代码

scala> val builder = new StringBuilder("foo bar baz ")
builder: StringBuilder = foo bar baz

scala> (0 until 5) foreach { builder.append("!") }

scala> builder.toString
res15: String = foo bar baz !
Run Code Online (Sandbox Code Playgroud)

我想这实际上就像是

(0 until 5) foreach builder.append("!").apply
Run Code Online (Sandbox Code Playgroud)

发生.任何人都可以向我解释为什么会发生这种情况或者我错了究竟发生了什么?

Aiv*_*ean 7

要了解发生了什么,我使用了我的小工具scala-to-java.

您的代码转换为Java,如下所示:

public final class _$$anon$1 {
  private final StringBuilder builder = new StringBuilder("foo bar baz ");

  private StringBuilder builder() {
    return this.builder;
  }

  {
    RichInt$.MODULE$.until$extension0(Predef$.MODULE$.intWrapper(0), 5).foreach((Function1<Object, Object>)this.builder().append("!"));
    this.builder().toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,结果builder.append("!")StringBuilder只是被转换Function1为foreach中的函数参数.

显然,StringBuilder如果你检查它的类型层次结构,确实是一个函数:

  • StringBuilder(scala.collection.mutable)
  • AbstractSeq(scala.collection.mutable)
  • AbstractSeq(scala.collection)
  • Seq(scala.collection)
  • PartialFunction(scala)
  • 功能1(scala)

作为结论:

  • 您可以使用任何StringBuilder从一个功能或部分功能Int,以Char
  • 在您的情况下,append仅评估一次,它的result(StringBuilder)用作函数.