函數是一組一起執行任務的語句。可以將代碼放到獨立的功能。如何劃分你的代碼不同功能之間,但在邏輯上,劃分通常是讓每個函數執行特定的任務。
Scala有函數和方法,我們術語說的方法和函數互換用微小的差別。Scala方法是其中有一個名字,簽名,任選一些注釋,有的位元組碼,其中如在Scala中函數是可被分配給一個變數的完整對象類的一部分。換句話說,函數,其被定義為某些對象的一個成員,被稱為方法。
函數定義可以出現在在源檔案的任何地方,Scala允許嵌套函數的定義,那就是其他函數定義的內建函式定義。需要注意的最重要的一點是,Scala的函數名稱可以類似+, ++, ~, &,-, -- , , /, :等字元。 函式宣告:
Scala的函式宣告有如下形式:
def functionName ([list of parameters]) : [return type]
如果保留關閉等號和方法體的方法為隱式聲明,抽象的封閉類型是抽象本身。 函數定義:
Scala函數定義有如下形式:
def functionName ([list of parameters]) : [return type] = {
function body
return [expr]
}
在這裡,傳回型別可以是任何有效scala資料類型,參數列表將是用逗號和參數,傳回值類型列表分離變數是可選的。非常類似於Java,一個返回語句可以在函數運算式可用情況下返回一個值。以下是這將增加兩個整數並返回的函數:
object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
函數,它不返回任何東西,可以返回這相當於在Java中void,並表示該函數不返回任何單元。Scala中不返回任何東西函數被稱為過程。以下是文法
object Hello{
def printMe( ) : Unit = {
println("Hello, Scala!")
}
}
調用函數:
Scala提供了一些文法的變化來調用方法。以下是調用一個方法的標準方法:
functionName( list of parameters )
如果函數被對象的一個執行個體調用使用,那麼使用類似於Java點標記如下:
[instance.]functionName( list of parameters )
下面是一個例子用來定義,然後調用函數:
object Test {
def main(args: Array[String]) {
println( "Returned Value : " + addInt(5,7) );
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
讓我們編譯和運行上面的程式,這將產生以下結果:
C:/>scalac Test.scala
C:/>scala Test
Returned Value : 12
C:/>
Scala函數是Scala編程的核心,這就是為什麼Scala被假定為一個函數式程式設計語言。以下是Scala程式員理解相關Scala函數的一些重要的概念。
函數按名稱調用
使用具名引數函數
函數使用可變參數
遞迴函式
預設參數值
高階函數
嵌套函數
匿名函數
部分應用函數
柯裡函數
閉包是函數,它的傳回值取決於此函數之外聲明一個或多個變數的值。考慮下面的一塊使用匿名函數的代碼:
val multiplier = (i:Int) => i * 10
在這裡,在函數體中使用的唯一變數, i * 0, 為i,其被定義為一個參數的函數。現在,讓我們來看另一塊代碼:
val multiplier = (i:Int) => i *factor
有兩個自由變數的乘數:i和factor。其中一個i是一個正式函數參數。因此,它被綁定到一個新的值在乘數每次調用。然而,factor不是一個正式的參數,那麼這是什麼。讓我們增加一行代碼:
var factor = 3
val multiplier = (i:Int) => i *factor
現在,factor具有參考變數在函數之外,但為封閉範圍的變數。讓我們試試下面的例子:
object Test {
def main(args: Array[String]) {
println( "muliplier(1)value = " + multiplier(1) )
println( "muliplier(2)value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
讓我們編譯和運行上面的程式,這將產生以下結果:
C:/>scalac Test.scala
C:/>scala Test
muliplier(1) value = 3
muliplier(2) value = 6
C:/>
上面的函數引用factor並讀取每個時間的當前值。如果函數沒有外部參考,那麼它就是封閉了自己。無需外部環境是必需的。
考慮下面這個簡單的例子,我們給一個字串類型的 val 變數:
object Test {
val greeting: String = "Hello, world!"
def main(args: Array[String]) {
println( greeting )
}
}
在這裡,上面的實值型別是從Java的java.lang.String借來的,因為Scala的字串也是Java字串。這一點是非常好的,要注意:每 一個Java類可用在Scala中。因此,Scala沒有String類並直接利用Java字串String類。因此,這一章已被寫入保持Java String的基礎。
在Scala中與在Java中一樣,一個字串是不可變的對象,也就是,這是不能被修改的對象。另一方面,對象是可以修改的,如數組對象,被稱為可變對象。由於字串是非常有用的對象,在本節的其餘部分,我們目前最重要瞭解類java.lang.String的方法定義。
from: http://www.yiibai.com/scala/scala_basic_syntax.html