Автор этой статьи здесь. Функция block
вашей summer
функции ничего не возвращает, вы должны изменить тип на block: Int.() -> Int
и затем вернуть его ответ:
fun summer(block: Int.() -> Int): Int {
val myint = 5
return myint.block()
}
Теперь ваше напечатанное целое число будет 4
, потому что последнее dec()
станет результатом пройденной лямбды. Чтобы это исправить, вы можете связать оба dec
звонка:
fun main(args: Array<String>) {
val mint = summer {
dec().dec()
}
println(mint)
}
Наконец, 5
будет уменьшен вдвое, что приведет к 3
.
Если, с другой стороны, у вас есть какой-то произвольный объект, который мутирует с помощью функции dec
, ваш подход будет работать так:
class Ref(var v: Int) {
fun dec() {
v -= 1
}
}
fun summer(block: Ref.() -> Unit): Int {
val ref = Ref(5).apply(block)
return ref.v
}
fun main(args: Array<String>) {
val mint = summer {
dec()
dec()
}
println(mint)
}