scala:函式作為值或引數進行傳遞、作為返回值進行返回

孫晨c發表於2021-02-22

@

函式可以作為值進行傳遞

  • 語法var f = 函式名 _
  • 如果明確了變數的資料型別,那麼下劃線可以省略
//函式正常的宣告與呼叫
    def foo():Int={
      println("foo...")
      10
    }
    //將foo函式的執行結果賦值給res變數
    //val res: Int = foo()
    //println(res)

    //函式作為值進行傳遞  語法:在函式名稱的後面  +  空格  加下劃線
    //注意:將foo函式作為一個整體,賦值給f變數,  f是函式型別 ()=>Int
    //val f : () => Int = foo _
    def f : () => Int = foo _


    //這個時候,f就是一個函式,如果要想執行f函式的話,必須得加()
    //println(f)   //<function0>
    //println("-----------------")
    //println(f())

    //var ff = foo   //將函式執行結果賦值給ff
    //var ff = foo _   //將函式本身作為值賦給ff

    //將函式本身作為值賦給ff    如果明確了變數的型別,那麼空格和下劃線可以省略
    //var ff:()=>Unit = foo
    //println(ff)

函式可以作為引數進行傳遞

  • 通過匿名函式
  • 擴充套件函式的功能
  • 提高函式的靈活度
  //函式可以作為引數,進行傳遞(大多數情況都是通過匿名函式的形式)
    //定義一個函式calculator,該函式接收一個函式型別的引數op,op定義了對兩個整數要進行什麼樣的操作
    def calculator(a:Int,b:Int,op:(Int,Int)=>Int): Int ={
      op(a,b)
    }

    //定義一個函式f1,完成兩個整數的加法運算
    def op(a:Int,b:Int):Int={
      a + b
    }
    //println(calculator(10,20,op))
    println(calculator(50, 20, (a: Int, b: Int) => {
      a - b
    }))

    println(calculator(50, 20, _ - _))
    println(calculator(50, 20, _ + _))
    */

函式可以作為返回值進行返回

  • 函式的巢狀
  • 函式鏈式呼叫,通過引數傳遞資料,在執行的過程中,函式始終佔據棧記憶體,容易導致記憶體溢位
  • 閉包
  • 柯里化
//函式可以作為返回值進行返回----函式的巢狀
    def f1():()=>Unit ={
      def f2(): Unit ={
        println("f2函式被呼叫了")
      }
      //將f2作為返回值返回給f1
      f2 _
    }

    //ff就是f2
    //var ff = f1()
    //ff()

    //f1()()

什麼是匿名函式

  • 引數的型別可以省略,會根據形參進行自動的推導
  • 型別省略之後,發現只有一個引數,則圓括號可以省略;其他情況:沒有引數和引數超過1的永遠不能省略圓括號。
  • 匿名函式如果只有一行,則大括號也可以省略
  • 如果引數只出現一次,則引數省略且後面引數可以用_代替

相關文章