在函数文字中使用隐式变量

时间:2019-05-08 13:22:28

标签: kotlin

我开始阅读Kotlin课程书。我停止使用函数文字。这里有一个代码:

val printMessage = { message: String -> println(message) }
printMessage("hello")
printMessage("world")

然后我有一个信息可以省略参数类型:

{ message -> println(message) }

现在我要进行下一步:

“实际上,Kotlin有一个巧妙的技巧。如果只有一个参数并且可以推断出类型,那么编译器将允许我们完全省略该参数。在这种情况下,它将使隐式变量可用: / p>

{println(it)}

现在使用此代码后,我得到一个错误“未解析的引用:它”和“公共运算符的太多参数有趣的invoke():在kotlin.Function()中定义的???”:

val printMessage = {println(it)}
printMessage("print something")

我的问题是如何在单个参数函数文字中使用隐式变量?

2 个答案:

答案 0 :(得分:3)

请参见Kotlin documentation,具体说来是:

  

如果编译器可以自己找出签名,则不允许   声明唯一的参数并省略->。该参数将是   以名称it隐式声明。

在您的情况下,编译器(至少在当前版本为1.3.31之前)无法自行找出签名:

val printMessage = {println(it)}

但是,如果您为printMessage变量指定一个显式类型,它将起作用:

val printMessage: (String) -> Unit = { println(it) }

答案 1 :(得分:3)

您始终需要提供有关所有通用参数的所有信息。如果要忽略它,则需要从代码的其他部分中推断出它。不过,您提供的唯一信息是您希望printMessage是lambda。因此,它假定其类型为()->Unit。这是因为您没有为lambda本身声明参数。因此,隐式参数it不可用。

val printMessage = { it: String -> println(it) }
val printMessage: (String)->Unit = { println(it) }

简而言之:如果您在带有一个参数的lambda内,则可以将隐式it用作此参数名称,但是在lambda主体内的名为it的引用则不会声明单个参数。