Scala 中的应用和 lambdas [英] Apply and lambdas in Scala

查看:15
本文介绍了Scala 中的应用和 lambdas的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下一段代码

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 !

我想实际上就像

(0 until 5) foreach builder.append("!").apply

发生了.谁能向我解释为什么会发生这种情况,或者如果我错了,究竟会发生什么?

happens. Can anyone explain to me why that happens or if I'm wrong what really happens?

推荐答案

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

To understand what's happening I used my small tool scala-to-java.

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

Your code transpiled to Java looks like this:

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();
  }
}

如您所见,builder.append("!") 的结果,也就是 StringBuilder 被简单地转换为 Function1并用作 foreach 中的函数参数.

As you can see, result of the builder.append("!"), which is also StringBuilder is simply cast to Function1 and used as a function argument in foreach.

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

Apparently, StringBuilder is indeed a function, if you check it's type hierarchy:

  • StringBuilder (scala.collection.mutable)
  • AbstractSeq (scala.collection.mutable)
  • AbstractSeq (scala.collection)
  • 序列(scala.collection)
  • 偏函数(scala)
  • 函数 1 (scala)

总结:

  • 您可以使用任何 StringBuilder 作为函数或部分函数,​​从 IntChar
  • 在您的情况下,append 只计算一次,其结果 (StringBuilder) 用作函数.
  • You can use any StringBuilder as an function or partial function from Int to Char
  • In your case, append is evaluated only once and it's result (StringBuilder) is used as a function.

这篇关于Scala 中的应用和 lambdas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆