Правильный способ объявления массивов с помощью конструктора Array ()? - PullRequest
0 голосов
/ 27 октября 2018

Я знаю, что конструктор Array() принимает два аргумента: размер массива и функцию, которая получает индекс массива и возвращает значение для этого индекса.

Я написал несколько примеров программ в онлайн-среде IDE kotlinlang.org и объявил и инициализировал свои массивы так:

var array = Array(9, {i -> ' '})

«Пустой» массив символов размера 9, полностью заполненный пробелами. Это прекрасно работает в компиляторе kotlinlang.org и работает хорошо; однако, когда я пытаюсь импортировать тот же код в IntelliJ-IDEA, я получаю следующее предупреждение:

Предупреждение: Kotlin: параметр 'i' никогда не используется, может быть переименован в _

Что означает символ подчеркивания? Как это действует как индекс? Переименование i в _ удаляет предупреждение, но что именно оно делает?

Как правильно использовать конструктор Array() для инициализации массива с помощью лямбда-выражения? Имейте в виду, я знаю, что лямбда-выражение можно написать вне скобок, но я все равно решил включить его, потому что оно довольно простое.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 28 октября 2018

Все определения ниже создают один и тот же массив.Kotlin (и IntelliJ) препятствуют избыточному коду, поэтому _ «лучше», чем i (поскольку я не используется), а «ничто» лучше, чем _.Наконец, IntelliJ рекомендует, чтобы последний параметр лямбда находился в отдельном блоке - согласно четвертому примеру:

Array(9, { i -> ' ' })
Array(9, { _ -> ' ' })
Array(9, { ' ' })
Array(9) { ' ' }
0 голосов
/ 27 октября 2018

Это просто предупреждение.

В Kotlin, если вы не используете параметр, вы можете переименовать его в _. Это более читабельно. В вашем случае вы не используете i справа от вашей лямбда-функции. Таким образом, вы можете переименовать его в _

0 голосов
/ 28 октября 2018

Как уже говорили другие ответы, ваш код верен, но, поскольку вы не используете параметр i, нет необходимости давать ему имя.Вместо этого вы можете использовать _, который является просто заполнителем: он указывает Kotlin, что лямбда принимает параметр, но вас это не волнует.

(Подчеркивание здесь может показаться не очень полезным,но это может помочь в более сложных случаях. Например, если у вас большой класс Person со многими полями, вы можете использовать только пару из них, например, for ((name, _, _, age) in persons)…)

Фактически вы можете упроститьвыражение еще дальше!В отличие от более традиционных блочно-структурированных языков, в котлинских скобках обычно указывается лямбда (за исключением случаев, таких как функциональные тела и ветви if и when), даже без ->.И здесь Котлин может вывести число, а также тип параметров.Таким образом, вы можете полностью удалить параметр и стрелку и просто использовать:

var array = Array(9, {' '})
0 голосов
/ 27 октября 2018

Там написано «Предупреждение», а не «ошибка».

Warning: Kotlin: Parameter 'i' is never used, could be renamed to _

Код прекрасно компилируется, он просто сообщает, что неиспользуемый лямбда-параметр можно переименовать в _чтобы сделать более очевидным, что лямбда-параметр не используется.

Итак, чтобы ответить на ваш вопрос, вы правильно построили массив.Однако, если по какой-то причине вы хотели использовать индекс для построения массива, вы можете оставить его по имени и использовать его для вычислений внутри лямбда-выражения, которое выполняется для построения каждого элемента массива.Например:

val array = Array(10, { i -> i * 10  })

Что приведет к массиву вроде:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Кроме того, обратите внимание, что вы использовали var, это означает, что ваша переменная arrayизменяемый (то есть вся переменная может быть переназначена).Вероятно, это не то, что вам нужно, поэтому вам следует отдать предпочтение val, если вы не хотите, чтобы переменная изменялась.

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