我正在尝试用 Scala 做一些实验。我想重复这个实验(随机),直到出现预期的结果并得到那个结果。如果我使用 while 或 do-while 循环执行此操作,那么我需要编写(假设“body”代表实验,“cond”表示是否符合预期):
do {
val result = body
} while(!cond(result))
但是,它不起作用,因为最后一个条件不能引用循环体中的局部变量。我们需要像这样修改这个控制抽象:
def repeat[A](body: => A)(cond: A => Boolean): A = {
val result = body
if (cond(result)) result else repeat(body)(cond)
}
它以某种方式工作,但对我来说并不完美,因为我需要通过传递两个参数来调用此方法,例如:
val result = repeat(body)(a => ...)
我想知道是否有更有效和更自然的方法来做到这一点,使它看起来更像一个内置结构:
val result = do { body } until (a => ...)
在这篇文章中找到了一个针对没有返回值的 body 的出色解决方案:如何在重复直到之前使 Scala 控制抽象?,最后一个单行答案。它body
在该答案中的部分不返回值,因此until
可以是新AnyRef
对象的方法,但该技巧不适用于此处,因为我们想要返回A
而不是AnyRef
. 有什么办法可以做到这一点?谢谢。