Scala基础教程(五):函数、闭包
函數是一組一起執行任務的語句。可以將代碼放到獨立的功能。如何劃分你的代碼不同功能之間,但在邏輯上,劃分通常是讓每個函數執行特定的任務。
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
總結
以上是生活随笔為你收集整理的Scala基础教程(五):函数、闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala基础教程(四):if语句、循环
- 下一篇: Scala基础教程(六):字符串、数组、