Разрушающие декларации в Kotlin - PullRequest
1 голос
/ 26 марта 2020

Я хочу вернуть несколько значений из функции. Как подсказал другой ответ SO, я использовал Destructuring с классом publi c, но проблема в том, что я не могу присвоить возвращенный результат Destructing уже захватывающим переменным

data class Result(val res1 :Int, val res2: Int)
class test{
        fun retresult():Result{
        return Result(2,2)
    }
}

fun main(args: Array<String>) {
    var var1:Int = 0
    var var2:Int = 0
    var des = test()
    //(var1, var2) = des.retresult() this doesn't work

    var1 = des.retresult().res1
    var2 = des.retresult().res2 // **works but calls function twice** 
}

Я не хочу инициализировать локальные переменные в точка возврата как

 val (var1, var2) = des.retresult()

1 Ответ

1 голос
/ 26 марта 2020

Вы можете назначить эти две переменные, не вызывая функцию дважды, используя with:

fun main(args: Array<String>) {
    var var1:Int = 0
    var var2:Int = 0
    var des = test()
    with (des.retresult()) {
        var1 = res1
        var2 = res2
    }
}

В качестве альтернативы, ваша функция может принимать аргументы функции для установки результатов, а затем вы можете передать установщики для эти свойства. Это не будет работать для локальных переменных, только для свойств членов. Если вы используете C, это похоже на передачу указателя на функцию, чтобы она могла напрямую изменять переменную, а не возвращать что-либо.

class Test (var one: Int, var two: Int)

fun doSomething(result1: (Int) -> Unit, result2: (Int) -> Unit) {
    result1(2)
    result2(2)
}

fun main() {
    val test = Test(1, 1)
    doSomething(test::one::set, test::two::set)
}

Есть открытое (и, кажется, в основном забытое) запрос функции для того, что вы предложили, деструктурируя присвоение существующим переменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...