2017-07-13 118 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表達式。