Eu tenho uma função:
fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int): Int {
return arg1 + arg2.length + lambda("123", 1)
}
Agora quero ligar e fazer o seguinte:
fun bar() {
foo(1, "2") { (a, b) -> 42 }
}
Mas tende a compilar erros:
Expected 2 parameters of types String, Int
Destructuring declarations initializer of type String must have a 'component1()' function
Eu também tentei usar tipos explicitamente
fun bar() {
foo(1, "2") { (a:String, b:Int) -> 42 }
}
mas ainda erro de compilação:
required (String,Int) -> Int
but found: (String) -> Int
{ (a, b) -> 42 }
é um lambda que usa um único parâmetro, que você desestrutura e chama(a, b)
.Por outro lado,
{ a, b -> 42 }
é um lambda que leva dois parâmetrosa
eb
.A propósito, não é certo nomear seu parâmetro como "lambda" no formato
fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int)
. Um lambda é um literal sintático digitado por função, da mesma forma que"hello"
um literal String. Mas um parâmetro String geralmente não é declarado como "stringLiteral" porque você pode não passar um literal, mas uma variável de string, ou uma chamada de função que retorna uma string. Da mesma forma, você não deve nomear seus parâmetros de tipo de função como "lambda" porque você pode passar uma função anônima, uma referência de método ou alguma outra expressão de tipo de função, não necessariamente um lambda. Os argumentos do tipo função são normalmente chamados de "bloco", como você pode encontrar nas funções stdlib do Kotlin, comolet
.