Scala基礎教程(五):函數、閉包_Scala

來源:互聯網
上載者:User

函數是一組一起執行任務的語句。可以將代碼放到獨立的功能。如何劃分你的代碼不同功能之間,但在邏輯上,劃分通常是讓每個函數執行特定的任務。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.