在Scala中套用和Lambda [英] Apply and lambdas in Scala
本文介绍了在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
作为从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中套用和Lambda的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文