如何将 2 个参数 lambda 作为函数参数传递? String 类型的解构声明初始值设定项必须具有“component1()”函数

问题描述 投票:0回答:1

我有一个功能:

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
kotlin lambda
1个回答
0
投票

{ (a, b) -> 42 }
是一个采用单个参数的 lambda,您已将其解构并称为
(a, b)

另一方面,

{ a, b -> 42 }
是一个带有两个参数的 lambda,
a
b

顺便说一句,在

fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int)
中将参数命名为“lambda”不太正确。 lambda 是函数类型的语法文字,就像“hello”是字符串文字一样。但字符串参数通常不称为“stringLiteral”,因为您可能不会传递文字,而是传递字符串变量或返回字符串的函数调用。同样,您不应该将函数类型参数命名为“lambda”,因为您可能会传递匿名函数、方法引用或某些其他函数类型表达式(不一定是 lambda)。函数类型参数通常称为“块”,正如您可能在 Kotlin stdlib 函数中找到的那样,例如
let

© www.soinside.com 2019 - 2024. All rights reserved.