Цель функции повтора - PullRequest
       1

Цель функции повтора

0 голосов
/ 29 декабря 2018

Используя kotlin, я могу повторить действие, по крайней мере, двумя способами:

val times = 5

// First option
for (i in 0 until times) {
    print("Action $i")
}

// Second option
repeat(times) {
    print("Action $it")
}

Я хотел бы знать цель repeat.

  • Следует ли заменить традиционную петлю for на функцию repeat, если это возможно?
  • Или есть специальные случаи для этой функции?
  • Есть ли какие-либо преимущества в функции repeat?

РЕДАКТИРОВАТЬ

Я провел небольшое исследование по этому вопросу.Поскольку kotlin является проектом с открытым исходным кодом, я мог загружать исходники и проверять историю git.

Я обнаружил, что функция

1) repeat заменяет расширение times.

public inline fun Int.times(body : () -> Unit)

2) KT-7074 .times функция устарела.Но почему?

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Из Standard.kt:

/**
 * Executes the given function [action] specified number of [times].
 *
 * A zero-based index of current iteration is passed as a parameter to [action].
 *
 * @sample samples.misc.ControlFlow.repeat
 */
@kotlin.internal.InlineOnly
public inline fun repeat(times: Int, action: (Int) -> Unit) {
    contract { callsInPlace(action) }

    for (index in 0 until times) {
        action(index)
    }
}

Как видите, repeat(times) на самом деле for (index in 0 until times).Существует также счетчик петель на основе нуля и он равен: it.

Должен ли традиционный цикл for быть заменен функцией повтора, если это возможно?

Я не могу найти причину для этого

ИлиСуществуют ли особые случаи для этой функции?

Нет Я могу придумать.

Есть ли какие-либо преимущества в функции повтора?

НетЯ могу думать, или, может быть (?) Только 1:в образовательных целях, я полагаю, легче учитьчто repeat(n) { } выполняет n итераций блока операторов внутри фигурных скобок .

0 голосов
/ 30 декабря 2018

Это просто вопрос удобства (сокращает код).Есть еще больше способов, например, использовать IntRange и forEach

(0..4).forEach {
    println(it)
}

0 1 2 3 4

Все они служат одной цели, поэтомувыбор за вами.

Вам также не нужно беспокоиться о производительности, поскольку repeat и forEach являются встроенными функциями, что означает, что лямбда-код копируется на сайт вызова во время компиляции.

0 голосов
/ 29 декабря 2018

Следующие строки - только мое мнение:

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

Вам решать, когда и как его использовать.

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