Size: a a a

2021 June 19

FG

Fuad Garayev in Kotlin Start
возможно ли поставить перед when() или if() условием точку так скажем для рекурсии?как лучше всего реализовать?Я имею ввиду если мы получили результат который нас не удовлитворяет,то заново начать  последний блок кода в функции
источник

AM

Andrew Mikhaylov in Kotlin Start
Не совсем понял. Может, вас do ... while устроит? В нём даже не надо заранее переменную объявлять, в условии модно использовать любые значения изнутри блока.
https://kotlinlang.org/docs/control-flow.html#while-loops
источник

FG

Fuad Garayev in Kotlin Start
val i = service.getMessage()
   when(i){
       "" -> {dosomethin1()}
       "lol" -> {dosomethin2()}
       "error" -> {}
   }
мне нужно если ответ i = "error" то повторить блок кода
источник

AM

Andrew Mikhaylov in Kotlin Start
Ну в лоб это переписывается как
do {
   val i = service.getMessage()
   when(i) {
       "" -> {dosomethin1()}
       "lol" -> {dosomethin2()}
       "error" -> {}
   }
} while (i == "error")
источник

FG

Fuad Garayev in Kotlin Start
все таки лучше делать с do while?
источник

FG

Fuad Garayev in Kotlin Start
я читал кое что про rectail,но видимо это сюда не подойдет
источник

AM

Andrew Mikhaylov in Kotlin Start
tailrec -- это просто модификатор, который можно повесить на функцию с хвостовой рекурсией, дабы компилятор её в цикл вывернул. Если вы уже описали свою функцию как функцию с хвостовой рекурсией -- вешайте его, конечно.
источник

AM

Andrew Mikhaylov in Kotlin Start
Есть локальные функции, если вам кусок функции f хочется выразить в виде хвостовой рекурсии -- заводите прям внутри вашей f новую tailrec fun g, и вызывайте её.
источник

AM

Andrew Mikhaylov in Kotlin Start
Я не уверен, что это будет читаемее do..while, но хозяин-барин же :)
источник

BP

Bogdan Panchenko in Kotlin Start
Исходя из сообщений выше

То что вы хотите может выглядит вот так

tailrec fun f(service: S) = when (service.getMessage()) {
     "" -> result1
     ...
      "error" -> f(service)
}
источник

BP

Bogdan Panchenko in Kotlin Start
Ну и да читается подобное не лучше, так как сайд эффекты
источник

FG

Fuad Garayev in Kotlin Start
спасибо
источник

BP

Bogdan Panchenko in Kotlin Start
Это примерно
источник

FG

Fuad Garayev in Kotlin Start
я все таки решил юзать do while
источник

FG

Fuad Garayev in Kotlin Start
просто дело в том что в некоторых случаях в блоке when() я вызываю определенные функции.я думал что при do while в таких ситуациях,до while не дойдет,но видимо я ошибался
источник

AM

Andrew Mikhaylov in Kotlin Start
do..while как раз для того и сделан, чтобы тело выполнились один раз, а после прошла проверка, идти ли на второй заход.
источник

FG

Fuad Garayev in Kotlin Start
ребята,я написал функцию которая принимает лямбду а лямбда в свою очередь возвращает стринг.
   override fun recallRecursively(filterFunc: (String) -> String) {
       do {
           val command = keywordSpotting.listen()
           filterFunc(command)
       } while (command != "error")
   }
источник

FG

Fuad Garayev in Kotlin Start
но почему то при использовании ,в блоке условия я не могу заюзать свою саспенд функцию.
recallRecursively(
   filterFunc = {
       when (it) {
           "lol" -> {
               getMessageData(receiver = receiver) // suspend func
               ""
           }
           "error" -> {
               "error"
           }}})
suspension functions can be called only within coroutine body,хотя функция в которой все происходит,тоже саспенд
источник

Na

Neon an Děv 8) in Kotlin Start
recallRecursively в coroutine скоупе?
источник

FG

Fuad Garayev in Kotlin Start
нет,она в саспенд функции
источник