首页 > 解决方案 > 我什么时候在 Kotlin 中使用另一个没有参数的函数?

问题描述

我是 Kotlin 的新手。我发现我可以使用另一个没有参数的函数,即使它有。让我知道什么时候可以使用它。

在此处输入图像描述

Q1) 为什么我可以使用 2 种类型?(带参数&不带参数)是Kotlin的特性吗?Q2) 这是什么意思?((结果!)-> 单位)!

标签: kotlin

解决方案


看起来你很困惑,你永远不能使用没有参数的函数。如果函数有参数,那么你必须以某种方式填充槽。

与您所指的内容最接近的是参数的默认值。

fun example(boolean: Boolean = true) {}

example()

example(true)

example(false)

您可以省略该参数,因为它已在函数签名中默认。

文档_

您在图像文件中显示的是 lambda。

在第一个示例中:

signIn(listener: Session...)

这似乎是一个回调。所以它会是一个接口,也可能是一个在异步操作完成时调用的抽象类。

第二个例子,它是作为 lambda 实现的回调

signIn() { result ->
   //do something
}

在 Kotlin 中,如果最后一个参数是 lambda 或可以实现为 lambda 的东西,则可以将其移出语法糖的括号。lambda 就像一个匿名函数,它是一个函数的文字。

例如,您可以声明一个 lambda:

val lambda = {text: String -> text.lenght % 2 == 0}

fun setRuleForText(rule: (String)-> Boolean) {...}

setRuleForText(lambda)

setRuleForText() { text: String 
    text.isNotEmpty()
}

在这种情况下,参数是一个 kotlin 函数。参数rule是一个接收 aString作为参数并返回的函数Boolean。需要指出的是,表达式返回最后写入的值而不需要保留return字。

这是文档在这里你可以从一个很好的来源看到更多关于函数的信息(作者是经过 Jetbrains 培训的 Kotlin 认证)

在您的情况下(Result) -> Unit,意味着 lambda 应该接收一个Result类型作为参数然后返回Unit(单元就像 Java 中的 void 但不止于此),没有显式返回类型。

signIn() { result ->
  //do something
}

大多数类型,lambdas 上的参数是自动推断的,但如果不是,那么

signIn() { result: Result ->
  //do something
}

推荐阅读