3 ms·
No, the idea is that {} denotes executable blocks, which lamdas are. In Kotlin, if the last parameter of a function is a lambda, you can close the parenthesis b
by RedNifre 5y ago
No, the idea is that {} denotes executable blocks, which lamdas are. In Kotlin, if the last parameter of a function is a lambda, you can close the parenthesis before the lambda:
f(5, { square(it) }
can be written as
f(5) { square(it) }
which makes constructs like
if(condition) { foo() }
Look like
if(condition, { foo() } )
as in a function that takes a boolean and a lambda and only executes the lambda if the boolean is true.
It's a neat reinterpretation of what {} means.
- kennywinker 5y agoI’m not super familiar with kotlin, but swift does the same thing you’re describing so i get where it’s useful. My beef is with including metadata about the executable block (parameter names) inside the block. So per your example: f(5) { square(it) } My preference would be to tag the fn signature on the outside of the braces, something like: f(5) [(x)->int]{ square(x) } I’d also accept ||, (), or nothing as the delimiters around the fn signature. Key point is that it’s OUTSIDE the executable block. I’m not opposed to using some smarts to infer/simplify the expression when possible. I.e. if it’s a closure with inferable parameter and return types the “it” construct could be used (in swift they use $0, $1, $2 etc for unnamed parameters). Just the only thing inside an executable block {} should be code that gets executed - not type information about that block