Котлин определяет методы расширения для этих деструкторов компонентов. В отличие от классов данных, они не генерируются бесконечно по одному для каждого элемента. Это также делает их немного опасными, к которым я вернусь позже.
Для справки, определение здесь , а KDoc можно найти здесь (поиск по component
в списке. Для легкого доступа, здесь component1 ).
Как вы можете видеть в определении источника (и документации по этому вопросу, но источник делает его более заметным), есть только 5 методов (component1
до component5
), каждый из которых вызывает get(n - 1)
, где n
- идентификатор деструктора компонента.
Если вы хотите больше, вам придется определить их самостоятельно, в виде:
inline operator fun <T> List<T>.componentN(): T {
return get(N - 1)
}
(или в стиле, предложенном в другой ответ - они дают одинаковые результаты.)
И снова, где N равно 6 и выше, соответствует количеству предметов, которые вы планируете иметь.
Однако я бы не рекомендовал это. Намного легче перебирать его с помощью цикла for, и он также менее подвержен ошибкам. Возьмите для примера это:
val (a, b, c, d, e) = listOf(1, 2, 3, 4)
Это вызовет исключение ArrayIndexOutOfBoundsException. Однако, если у вас есть статический список (и вы знаете, что делаете), уничтожение с помощью componentN
безопасно. Хотя, если у вас есть в основном статический список, в котором вы хотите использовать гибкость в будущем, вы можете использовать класс данных. Они также генерируют для вас функции componentN
и ограничивают количество полей, которые у вас есть, что означает отсутствие исключений во время выполнения, но вместо этого ошибки компилятора.
Если вы используете списки для включения итерации в дополнение к уничтожению, вы также можете воспользоваться альтернативным подходом, определить operator fun iterator
и вернуть список элементов.