https://kotlinlang.org logo
#getting-started
Title
# getting-started
t

tipsy

04/16/2021, 8:18 PM
in ran into an issue with default arguments
Copy code
myFunc(p1: String, p2: Consumer<*>, p3: String = "") {}
// is not the same as 
myFunc(p1: String, p2: Consumer<*>) { myFunc(p1, p2, "") }
myFunc(p1: String, p2: Consumer<*>, p3: String) {}
the compiler does not allow you to use trailing lambdas if you use default arguments i'm not really sure if it's an issue, but did seem odd to me
n

nanodeath

04/16/2021, 8:21 PM
I'm confused by the code snippet. why does only one have a body?
t

tipsy

04/16/2021, 8:22 PM
the body is irrelevant, but i added curly braces now
n

nanodeath

04/16/2021, 8:24 PM
what if you put p2 last?
t

tipsy

04/16/2021, 8:24 PM
unless i declare myFunc as two separate functions, i'm not able to call
Copy code
myFunc("test") { }
that will work
n

nanodeath

04/16/2021, 8:25 PM
trailing lambdas always require the lambda be the last argument tho
t

tipsy

04/16/2021, 8:26 PM
it is the last argument, since the third argument is omitted (it has a default value)
i don't see why the compiler cares if it's defined as two different functions, or one function with a default value
n

nanodeath

04/16/2021, 8:27 PM
if there's an argument after it, then it's not the last argument
default arguments don't completely obviate the need for overloads unfortunately
t

tipsy

04/16/2021, 8:29 PM
it would seem so
just a small gotcha after auto-converting some java code
r

Ruckus

04/16/2021, 8:53 PM
I don't understand your issue with putting the consmer last. It works fine for me: https://pl.kotl.in/B_F3K_Auz
Copy code
typealias Consumer<T> = (T) -> Unit

fun myFunc(p1: String, p2: String = "", p3: Consumer<String>) {
    p3(p1 + p2)
}

fun main() {
    myFunc("Test") { println(it) }
    myFunc("Test", "2") { println(it) }
}
(You may have a problem using
Consumer<*>
as that will accept only
Nothing
.)
n

nanodeath

04/16/2021, 9:03 PM
it's not always an option to change the signature 🙂
r

Ruckus

04/16/2021, 9:06 PM
Yes, that is true, but unless I missed something the discussion was:
Max Aller: what if you put p2 last?
david: unless i declare myFunc as two separate functions, i'm not able to call
myFunc("test") { }
I guess this is more of a discussion about what "last argument" means, and I'm just fixating on the wrong thing. Feel free to ignore me 🙂
n

nanodeath

04/16/2021, 9:17 PM
it's understandable that it's a point of confusion 🙂
t

tipsy

04/18/2021, 8:17 AM
@Ruckus the two lines you quote was not a question+response, it was two messages that were sent at the same time. a more accurate representation of the conversation would be
Max Aller: what if you put p2 last?
david: that will work
but i can't change the signature
n

nanodeath

04/18/2021, 3:24 PM
you could add an extension method with the arguments in the correct order perhaps
r

Ruckus

04/18/2021, 3:32 PM
Ah, got it. My bad.