Scala中的函數和方法(終於搞清楚了)

函數是一組一起執行一個任務的語句。 您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常是根據每個函數執行一個特定的任務來進行的。

Scala 有函數和方法,二者在語義上的區別很小。Scala 方法是類的一部分,而函數是一個對象可以賦值給一個變量。換句話來說在類中定義的函數即是方法。

我們可以在任何地方定義函數,甚至可以在函數內定義函數(內嵌函數)。更重要的一點是 Scala 函數名可以有以下特殊字符:+, ++, ~, &,-, – , , /, : 等

函數的聲明格式:
def functionName ([參數列表]) : [return type]
案例:

object Function {
 
  def main(args: Array[String]): Unit = {
    println(fun01(10)) //函數的調用
    println(fun02(10, 20)) //函數的調用
 
    //函數作爲參數傳給方法:
    val res = method02(10, fun02)
    println(res)
 
  }
 
  //函數的定義:val/var 函數名稱=(函數的參數列表)=>函數體
  val fun01 = (a: Int) => a + 10
 
  //定義函數,有兩個Int類型的參數
  val fun02 = (a: Int, b: Int) => {
    if (a > 10 || b > 10) a + b else a - b
  }
 
 
  //  方法和函數的區別:
  //  在函數式編程語言中,函數是“頭等公民”,它可以像任何其他數據類型
  // 一樣被傳遞和操
 
 
  //定義一個求和的函數
  val fun_sum = (x: Int, y: Int) => x + y
 
 
  //函數f的參數個數爲1,函數f的參數的數據類型爲Int,函數f的返回值是Int
  def method00(a: Int, f: Int => Int) = {
    a + f(10)
  }
 
 
  def method00(a: Int, b: Int, c: Int) = {
    //調用函數f對10和5求和之後,再和參數a求和
    a + b + c
  }
 
  //函數f的參數個數爲2,函數f的參數的數據類型都爲Int,函數f的返回值是Int
  def method02(a: Int, f: (Int, Int) => Int) = {
    //調用函數f對10和5求和之後,再和參數a求和
    var x = 10
    var y = 5
    val fvalues = f(x, y) //調用函數實現對10與5的和
    a + fvalues
  }
 
 
}

 /**

  *  方法的聲明和使用

  */

  

	
object Method {
 
  def main(args: Array[String]) {
    //調用:method01()或者method01
    //    method01
    //    method03
    println(method05("method05", 20))
  }
 
 
  /**
    * 使用def定義一個方法
    * 方法的定義:def 方法名(參數列表):返回值={方法體}
    */
  //def method07= 10
 
  def method01(): Unit = println("this is my first method")
 
 
  /**
    * 如果沒有參數、可以直接不用寫()
    */
  def method02 = println("this is my first method")
 
 
  /**
    * 如果沒有參數、不確定返回值數據類型時
    */
  def method03 = {
    println("this is my first method")
  }
 
  /**
    * 指定方法的返回數據類型,方法的最後一個表達式作爲方法的返回值
    */
  def method04: String = {
    "this is my first method"
  }
 
  /**
    * 當方法需要傳入參數是時:
    *
    * @return
    */
  def method05(str: String, age: Int): String = {
    //把參數傳入字符串裏
    s"$str method,and age=$age"
  }
 
}

// 方法的參數列表  常用的參數有默認參數,帶名參數和可變參數

	
object MethodArgment {
 
  def main(args: Array[String]) {
    //調用默認參數:
    method01("xingyue", 20, "nan")
    //  或者
    method01("qingyuan",22 )
 
    println("-----------------------------")
 
    //正常傳遞參數,根據參數列表順序傳遞
    method02("laozhang", 40)
    //scala的帶名參數:
    method02(age = 40, name = "laozhang")
 
    println("----------可變參數-------------------")
    method03(10, 20, 30, 40, 100, 1000)
 
  }
 
  /**
    * 默認參數
    * //我們在調用方法的時候,在某些情況下,沒給參數,這個時候,
    * 方法會使用默認的一個參數,但是這個參數從哪裏來?? 我在定義方法的時候就給了這個默認參數
    * //當我們給的參數不夠的時候,會自動的依次補齊默認參數
    *
    * @param name
    * @param age
    * @param sex
    */
  def method01(name: String, age: Int, sex: String = "nan"): Unit = {
    val info = s"your name is $name,and age is $age,and sex is $sex"
    println(info)
 
  }
 
  /**
    * 帶名參數:在調用函數的時候,我們不按照函數的定義參數列表來傳遞參數,
    * 使用的是帶名參數的方式來傳遞
    *
    * @param name
    * @param age
    */
  def method02(name: String, age: Int): Unit = {
    val info = s"your name is $name,and age is $age"
    println(info)
 
  }
 
 
  /**
    * 可變參數:在定義函數時,可能無法確認出到底有多少個參數,可以用變長參數的形式來定義函數
    *
    * @param argInt
    */
  def method03(argInt: Int*): Unit = {
 
    //變量可變參數遍歷方式1
    for (arg <- argInt.iterator)
      println(arg)
 
    //變量可變參數遍歷方式2
    for (arg <- argInt)
      println(arg)
 
  }
 
  def method04(age: Int, str: String*): Unit = {
 
    //變量可變參數遍歷方式1
    for (arg <- str.iterator)
      println(age + ":" + arg)
 
    //變量可變參數遍歷方式2
    for (st <- str)
      println(age + ":" + st)
 
  }
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章