Scala 中的应用和 lambdas [英] Apply and lambdas in Scala
本文介绍了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
作为函数或部分函数,从Int
到Char
- 在您的情况下,
append
只计算一次,其结果 (StringBuilder
) 用作函数.
- You can use any
StringBuilder
as an function or partial function fromInt
toChar
- In your case,
append
is evaluated only once and it's result (StringBuilder
) is used as a function.
这篇关于Scala 中的应用和 lambdas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文