在scala中,函數即對象,我們可以通過val來定義函數,
例如絕對值函數:def abs(x:Double)=if(x>0) x else -x
也可以如下定義:
val abs=(x:Double)=>{ if(x>0) x else -x }
但是並非所有的場合都可以如此替代,
來看一個示例:
object Words { private val filePath = "/tmp/words.txt" val getWords1 = read() def getWords2 = read() val getWords3 = () => read() def write(content: Traversable[String]) = { import com.flute.common.Implicits._ content.saveToFile(filePath) } private def read() = { scala.io.Source.fromFile(filePath).mkString } }
測試代碼:
object Test{ def main(args: Array[String]) { Words.write(Traversable("scala", "java", "python")) println(Words.getWords1) println(Words.getWords2) println(Words.getWords3()) Words.write(Traversable("js", "c++")) println("after update words...") println(Words.getWords1) println(Words.getWords2) println(Words.getWords3()) } }
運行結果:
scala
java
python
scala
java
python
scala
java
python
after update words...
scala
java
python
js
c++
js
c++
可以發現,當修改文件內容后,調用getWords1返回的結果並未更新,
實際上,這里的getWords1是一個成員常量,而getWords3,“=”后面的部分是一個匿名函數,getWords3是匿名函數的別名。