Kotlin 在函数文本中使用隐式变量

Kotlin 在函数文本中使用隐式变量,kotlin,Kotlin,我开始读科特林的课程书。我停止使用函数文本。这里我有一个代码: val printMessage = { message: String -> println(message) } printMessage("hello") printMessage("world") 然后我有一个可以忽略参数类型的信息: { message -> println(message) } 现在我有了下一步: “事实上,Kotlin有一个更简洁的技巧。如果只有一个参数,并且类型可以出错,那么编译器将允

我开始读科特林的课程书。我停止使用函数文本。这里我有一个代码:

val printMessage = { message: String -> println(message) }
printMessage("hello")
printMessage("world")
然后我有一个可以忽略参数类型的信息:

{ message -> println(message) }
现在我有了下一步:

“事实上,Kotlin有一个更简洁的技巧。如果只有一个参数,并且类型可以出错,那么编译器将允许我们完全忽略该参数。在这种情况下,它使隐式变量可用:

{println(it)}
现在在使用这段代码之后,我得到了一个错误“未解析引用:it”和“公共运算符fun invoke()的参数太多”:???在kotlin.Function()中定义:

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

请参阅,特别是其中的说明:

如果编译器能够自行识别签名,则不允许 声明唯一参数并忽略
->
。该参数将 在名称
it
下隐式声明

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

val printMessage = {println(it)}
但是,如果为
printMessage
变量指定一个显式类型,它将起作用:

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

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

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

简单地说:如果你在一个有一个参数的lambda中,隐式的
it
可以用作这个参数名,但是lambda主体中名为
it
的引用并没有声明单个参数。

我猜你的书是斯蒂芬·塞缪尔和斯蒂芬·博库图(Packt出版社)的《编程科特林》(第121页)。这没有错,但编译器需要能够计算出签名。哪一个更常用、更可读?我刚开始学习,对我来说,第一行看起来更好。还是仅仅取决于个人偏好?我只使用lambdas作为参数,您必须显式声明其类型。在在本例中,我实际上声明了一个本地函数:
funprintmessage(value:String)=println(value)
。这也让读者清楚了它的用法。
val printMessage = { it: String -> println(it) }
val printMessage: (String)->Unit = { println(it) }