Linię 4 mógłbyś rozbić na kilka lini, tak, żeby wyjąć logikę generowania gwiazdek z print'a:
fun menu(menuList: List<String>){
menuList.forEach { menu ->
val (type, name, price) = menu.split(',')
val stars = repeat(40 - name.length) { print("*") }
println("$name$stars$price")
}
}
w tym momencie nadal będzie się wyświetlać to samo. Dlaczego tak się dzieje?
W momencie wykonywania się lini z `println` najpierw ustalana jest wartość argument(ów) funkcji `println`, dopiero potem jest ona wywoływana i wyświetla się to co zostanie do niej przekazane.
Czyli funkcja repeat wywołuje się najpierw. Dlatego też gwiazdki wyświetlają się jako pierwsze
jeśli spojrzysz w dokumentację funkcji repeat
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/repeat.html
to zobaczysz, że ta funkcja wywołuje posłany do niej callback n razy i zwraca Unit, więc kiedy wywołujesz funkcję repeat, to funkcja wyświetlająca gwiazki wykonuje się te n, razy a potem funkcja repeat zwraca Unit
wynik więc jest taki:
menuList.forEach { menu ->
val (type, name, price) = menu.split(',')
println("$name
// kotlin zna wartość zmiennej price i name, więc wykonuje się następna lini
${repeat(40 - name.length){ print("*")}} // o ta linia, i w tym momencie, przed wykonaniem się println'a
// repeat wywołuje ten callback { print("*") } 40 - name.length razy
// następnie funkcja repeat zwraca kotlin.Unit
$price
// teraz kotlin łączy stringa w całość, i go przekazuje do println
")
}