1. 程式人生 > >Scala方法與函式的區別雖然小,但是這一點你必須知道

Scala方法與函式的區別雖然小,但是這一點你必須知道

在這裡插入圖片描述
  簡介
  Scala 有方法與函式,二者在語義上的區別很小。Scala 方法是類的一部分,而函式是一個物件可以賦值給一個變數。換句話來說在類中定義的函式即是方法。 我們這裡會統稱為函式。
  Scala 中的函式是一個繼承了 Trait類的物件。函式定義由一個 def 關鍵字開始,緊接著是可選的引數列表,一個冒號 : 和方法的返回型別,一個等號 = ,最後是方法的主體。
  def functionName ([引數列表]) : [return type] 如果沒有等號和方法主體,那麼函式會被隱式宣告為抽象(abstract)。
  基本函式
  //將兩個傳入的引數相加並求和 object add{ def addInt( a:Int, b:Int ) : Int = { var sum:Int = 0 sum = a + breturn sum} }


  //如果沒有返回值,可返回Unit型別 object Hello{ def printMe( ) : Unit = { println(“Hello, Scala!”) } }
  //函式呼叫 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 + breturn sum} }
  函式傳名呼叫
  scala直譯器在解析函式引數時有兩種方式
  傳值呼叫(call-by-value):先計算引數表示式的值,再應用到函式內部傳名呼叫(call-by-name):將未計算的引數表示式直接應用到函式內部,每次使用傳名呼叫時,直譯器都會計算一次表示式的值。
  object Test { def main(args: Array[String]) { delayed(time()); }   def time() = { println("獲取時間,單位為納秒") System.nanoTime } def delayed( t: => Long ) = { println("在 delayed 方法內") println("引數: " + t) t } }
函式指定引數名一般情況下函式呼叫引數,就按照函式定義時的引數順序一個個傳遞。但也可以通過指定函式引數名,並且不需要按照順序向函式傳遞引數,例項如下:
  object Test { def main(args: Array[String]) { printInt(b=5, a=7); } def printInt( a:Int, b:Int ) = { println("Value of a : " + a ); println("Value of b : " + b ); } }
  可變引數
  Scala 通過在引數的型別之後放一個星號來設定可變引數。
  object Test { def main(args: Array[String]) { printStrings(“Runoob”, “Scala”, “Python”); } def printStrings( args:String* ) = { var i : Int = 0; for( arg <- args ){ println(“Arg value[” + i + "] = " + arg ); i = i + 1; } } }
  預設引數值

  Scala 可以為函式引數指定預設引數值,使用了預設引數,在呼叫函式的過程中可以不需要傳遞引數,這時函式就會呼叫它的預設引數值,如果傳遞了引數,則傳遞值會取代預設值。例項如下:
  object Test { def main(args: Array[String]) { println( "返回值 : " + addInt() ); } def addInt( a:Int=5, b:Int=7 ) : Int = { var sum:Int = 0 sum = a + breturn sum} }
  匿名函式
  scala 中定義匿名函式的語法很簡單,箭頭左邊是引數列表,右邊是函式體。比如, var inc = (x:Int) => x+1閉包閉包是一個函式,返回值依賴於宣告在函式外部的一個或多個變數。
  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 }
  文章來自:https://www.itjmd.com/news/show-3234.html