我有一个功能:
fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int): Int {
return arg1 + arg2.length + lambda("123", 1)
}
Nw 我想调用它并执行以下操作:
fun bar() {
foo(1, "2") { (a, b) -> 42 }
}
但它往往会编译错误:
Expected 2 parameters of types String, Int
Destructuring declarations initializer of type String must have a 'component1()' function
我也尝试明确使用类型
fun bar() {
foo(1, "2") { (a:String, b:Int) -> 42 }
}
但仍然编译错误:
required (String,Int) -> Int
but found: (String) -> Int
{ (a, b) -> 42 }
是一个采用单个参数的 lambda,您已将其解构并称为(a, b)
。另一方面,
{ a, b -> 42 }
是一个带有两个参数的 lambda,a
和b
。顺便说一句,在 . 中将参数命名为“lambda”不太正确
fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int)
。"hello"
lambda 是函数类型的语法文字,与字符串文字相同。但字符串参数通常不会声明为“stringLiteral”,因为您可能不会传递文字,而是传递字符串变量或返回字符串的函数调用。同样,您不应该将函数类型参数命名为“lambda”,因为您可能会传递匿名函数、方法引用或某些其他函数类型表达式(不一定是 lambda)。函数类型参数通常称为“块”,正如您可能在 Kotlin stdlib 函数(例如let
.