Вам не нужна вторая пара скобок, использование должно быть:
repeatLoop (x) until (cond) //or...
repeatLoop {x} until {cond}
А не:
repeatLoop {x} { until(cond) } //EXTRA PAIR OF BRACES
Ошибка означает , чтоScala считает, что вы пытаетесь вызвать метод с подписью, например:
def repeatLoop(x: => Unit)(something: X) //2 parameter lists
, и не может найти такой метод.Он говорит, что «repeatLoop (body)» не принимает параметры .Полный список кода для решения, вероятно, выглядит примерно так:
object Control0 {
def repeatLoop(body: => Unit) = new Until(body)
class Until(body: => Unit) {
def until(cond: => Boolean) {
body;
val value: Boolean = cond;
if (value) repeatLoop(body).until(cond)
}
}
def main(args: Array[String]) {
var y: Int = 1
println("testing ... repeatUntil() control structure")
repeatLoop {
println("found y=" + y)
y += 1
}.until(y < 10)
}
}
Здесь необходимо сделать два полезных замечания:
- Решение не является хвостово-рекурсивным иприведет к
StackOverflowError
для длинных итераций (попробуйте while (y < 10000)
) until
кажется мне неправильным (было бы более естественно остановиться, когда условие станет истинным, а не продолжатьпока это правда).