scala中的val與def


 

  在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是匿名函數的別名。

 
        

 






  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM