在Scala中套用和Lambda [英] Apply and lambdas in Scala

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

问题描述

我有以下一段代码

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-到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)
  • Seq(scala.collection)
  • PartialFunction(标量)
  • Function1(标量)

结论:

  • 您可以使用任何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中套用和Lambda的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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