2017-07-13 75 views
0

我正在学习方法和函数之间的区别。我下面这个链接了解scala的Vs函数

http://jim-mcbeath.blogspot.co.uk/2009/05/scala-functions-vs-methods.html

文章说,如果你编译下面的代码:

class test { 
def m1(x:Int) = x+3 
val f1 = (x:Int) => x+3 
} 

我们应该得到两个文件 1的Test.class 2.测试$$ anonfun $ 1 .class

但我不明白。其次,例如说,如果我们在REPL执行下面的命令,我们会得到下面的

scala> val f1 = (x:Int) => x+3 
f1: (Int) => Int = <function> 

但我只得到这个

scala> val f1 = (x:Int) => x+3 
f1: Int => Int = $$Lambda$1549/1290[email protected] 

是因为我们使用的是不同的版本?请帮忙。

+2

是的,早期版本的Scala(和REPL)将产生结果的''表示。 – jwvh

+0

你应该永远不要依赖这样的实现细节。例如,由于显而易见的原因,Scala.js将始终生成ecactly * zero *类文件。 –

回答

2

Scala 2.11和早期版本的行为如博客文章中所示。

行为在Scala 2.12中发生了变化。 Scala现在使用添加到JVM版本8的lambda支持,所以它不需要发出额外的.class文件。结果,由2.12生成的.jar文件通常要小得多。作为一个副作用,Scala不能覆盖toString了,所以你可以看到标准的JVM toString输出为lambda表达式。