У меня есть функции Kotlin, возвращающие список правильно? - PullRequest
0 голосов
/ 04 мая 2019

Я новичок в Kotlin (из Delphi, который является объектно-ориентированным Pascal). Я просто хочу убедиться, что у меня есть функции, возвращающие List<> s правильно:

Здесь приведен нелепо простой пример:

    fun firstTenInts(): List<Int> {
        val iList: MutableList<Int> = mutableListOf()
        for (i in 1..10)
            iList.add(i)
        return iList
    }

Итак, мои мысли / вопросы здесь:

  • Правильно ли использовать MutableList внутри функции и просто возвращать ее (даже если тип функции List)?

  • Нужно ли для создания локальной MutableList переменной? Нужна ли какая-либо локальная переменная "list"? Я привык (опять же, Delphi) делать что-то вроде:

    function firstTenInts: TStringList;
    var
      i: integer;
    begin
    result.Clear;
    for i := 1 to 10 do
      result.Add(IntToStr(i));
    end;

, который не требует "новой" локальной переменной. Я просто "работаю" result, что очень похоже на значение return Котлина, за исключением того, что оно служит локальной переменной типа функции, которая может быть "обработана" во всей функции.

  • Нет ли способа манипулировать значением return функции Котлина, кроме как с помощью другой (локально созданной) переменной?

  • Наконец, я могу быть уверен, что любые локальные переменные, которые я создаю, уничтожаются, когда функция завершается, даже если я "передаю их назад" - правильно?

Спасибо!

P.S. Я знаю, что это абсурдный способ создать List из 10 целых чисел. Я использую это только как основу для вопросов / проблем, которые я подробно описал выше. Предположим, что возвращаемое List будет неизвестного размера.

Пожалуйста, не предлагайте лучшие способы создания этого списка целых чисел; это не то, о чем я спрашиваю

Ответы [ 3 ]

0 голосов
/ 04 мая 2019

Существуют различные способы создания ArrayList из 10 элементов (как в приведенном вами примере) . Ниже приведен фрагмент кода, например:

// directly returning array list as Kotlin has functionality to define such kind of function just like macros

fun firstTenInts(): List<Int> = arrayListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// Or by using standard function apply

fun firstTenInts(): List<Int> = ArrayList<Int>().apply {
        for (i in 1..10)
            this.add(i)
    }

// Or by declaring variable of ArrayList

fun firstTenInts(): List<Int> {
    val iList = ArrayList<Int>()
    for (i in 1..10)
        iList.add(i)
    return iList
}

// Or by using standard function with

fun firstTenInts(): List<Int> = with(ArrayList<Int>()) {
    for (i in 1..10)
        this.add(i)
    return@with this
}

Выше приведены различные примеры, определяющие, как вы можете действовать по-разному. (Хотя приведенный вами пример также является допустимым примером) .

0 голосов
/ 08 мая 2019
  • Правильно ли я использовать MutableList внутри функции и просто вернуть ее (даже если тип функции List)?

Как правило, все в порядке. Вы делаете такие вещи, если вам требуется список, который может быть изменен внутри функции, но извне вы не хотите, чтобы он был легко изменяемым (это не значит, что он не изменяем; вы все равно можете привести его к изменяемому списку). то есть firstTenInts() as MutableList будет работать, и вы также можете изменить его снова). Нужен ли вам этот изменяемый список в функции или нет, зависит от вас. Например, простой вызов listOf(1, 2, 3) немедленно вернет вам List<Int>, т.е. fun first3Ints() = listOf(1,2,3) немедленно вернет List<Int>.

  • Нужно ли создавать локальную переменную MutableList? Нужна ли какая-нибудь локальная переменная list? Я привык (опять же, Delphi) делать что-то вроде:

Тебе не нужно, но ты можешь. Вам решать, что лучше соответствует вашим потребностям. Это также относится к вашей локальной переменной списка. Вы не обязательно нуждаетесь в нем, даже если он у вас будет, тем не менее, под капотом. Пример: * +1022 *

fun first3Ints() = listOf(1, 2, 3)

переводится примерно так:

fun first3Ints() : List<Int> {
  val result = listOf(1, 2, 3)
  return result
}

В меньших функциях вы по крайней мере можете сэкономить некоторые объявления переменных, используя прямые присваивания Вы также можете использовать что-то вроде apply, also, let, run или with, чтобы преодолеть val/var, например. (просто симуляция ... все варианты могут быть реализованы проще):

fun first3Ints() = arrayListOf().apply {
  add(1) // apply allows calling all methods of the receiver directly.. (receiver = arrayListOf...)
  add(2)
  add(3)
}
fun first2Ints() = arrayListOf().also { // similar to apply, but now there is an 'it' available... you could also name that variable differently, e.g. using .also { result -> result.add(1) }
  it.add(1)
  it.add(2)
}
  • Нет ли способа манипулировать значением return функции Котлина, кроме как с помощью другой (созданной локально) переменной?

Так что это становится да (хотя ... технически говоря, он будет один) ... это возможно, но вам нужно указать, что вы в основном хотите использовать, за исключением случая, когда вы реализуете функцию расширения. Тогда this внутри функции расширения фактически становится объектом, для которого вы вызвали функцию.

  • Наконец, я могу быть уверен, что любые локальные переменные, которые я создаю, уничтожаются, когда функция завершается, даже если я "передаю их обратно" - правильно?

... да и нет. Да, вы можете быть уверены, что при возникновении необходимости любая локальная переменная будет собираться мусором (за исключением того, что вы делаете что-то особенное). И есть также нет: вы не знаете, когда они будут уничтожены. Что касается возвращаемого значения, оно еще более особенное: вы фактически получаете только ссылку на объект, а не сам объект ... так что каким-то образом вы в основном получаете эту локальную переменную обратно. Возможно, вы захотите взглянуть на JVM / стек и кучу, а также на то, как на объекты ссылаются и хранятся ...

0 голосов
/ 04 мая 2019

Вы вернулись правильно, и вы можете использовать ArrayList вместо mutableListOf, и проблем не будет ... но все же я не понял вашу главную проблему, но основная тема, о которой вы говорили, показывает, что вы хотите быть уверены виспользуя список в качестве возврата, и это правильно, человек

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