簡體   English   中英

匿名函數:常規調用 VS 速記語法

[英]Anonymous Functions: Regular call VS Shorthand Syntax

我是 Kotlin 的新用戶。

我對匿名函數進行了一些試驗,直到使用不同的方法面對同一概念的不同輸出。

  • 第一:創建我的匿名 function:
var greetingFunction = { playerName: String , numBuildings: Int ->
    val currentYear = 2022
    println("Adding $numBuildings houses")
    "Welcome to SimVillage, $playerName! (Copyright $currentYear)\n"
}
  • 第二:創建一個 function 以另一個 function 作為參數:
private fun runSimulation(playerName: String, greetingFunc: (String, Int) -> String){
    val numOfBuildings = (1..3).shuffled().last()
    println(greetingFunc(playerName, numOfBuildings))
}

A- 定期撥打匿名電話 function:

println(runSimulation("Ahmed", greetingFunction))

Output:

Adding 3 houses
Welcome to SimVillage, Ahmed! (Copyright 2022)

B- 匿名撥打電話 function:

println(runSimulation("Different") { playerName: String , numBuildings: Int ->
    val currentYear = 2022
    println("Adding $numBuildings houses")
    "Welcome to SimVillage, $playerName! (Copyright $currentYear)\n"
})

Output:

kotlin.Unit
Adding 2 houses
Welcome to SimVillage, Different! (Copyright 2022)

kotlin.Unit

我試圖刪除println()並直接調用runSimulation function,而 output 是:

Output:

kotlin.Unit
Adding 2 houses
Welcome to SimVillage, Different! (Copyright 2022)

我真正想知道的是:首先我是如何使用速記語法打印“kotlin.Unit”的?

Kotlin 會自動推斷匿名函數的類型 由於greetingFunction的最后一行是一個字符串

var greetingFunction = { playerName: String , numBuildings: Int ->
    val currentYear = 2022
    println("Adding $numBuildings houses")

    // the last line is a string -> Kotlin will infer that the return type is a String
    "Welcome to SimVillage, $playerName! (Copyright $currentYear)\n"
}

推斷的類型是

var greetingFunction: (String, String) -> String

推斷塊體函數的返回類型 如果 function 沒有返回有用的值,則其返回類型為Unit function

private fun runSimulation(playerName: String, greetingFunc: (String, Int) -> String) {
    val numOfBuildings = (1..3).shuffled().last()
    println(greetingFunc(playerName, numOfBuildings))
}

因此將返回Unit ,所以

println(runSimulation("foo") { _, _ -> "bar" })

會打印runSimulation()返回值, Unit.toString()kotlin.Unit

由於runSimulation()也會打印到標准輸出,這實際上與運行相同

println(println("bar"))

首先,“內部” println()將打印 output bar ,然后“外部” println()將打印kotlin.Unit

bar
kotlin.Unit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM