我开始阅读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")
我的问题是如何在单个参数函数文字中使用隐式变量?
答案 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
的引用则不会声明单个参数。