在scala中,我们可以使用for循环,如下所示:
for { a <- someCollection
b = a.someFunc} //inbody we can use b
我需要与while循环类似的功能,例如:
while({ val a = someFunction
a.isDefined }) { //do something with a in body }
我如何在scala中执行此操作?
修改
我知道我们可以使用var on top并在循环中修改它,但我正在寻找更优雅的东西。
我希望完成的内容如下。函数someFunction
遍历Options
的集合并检查不是None的项。如果找不到这样的选项,则返回None。我可以使用
for( a <- myCollection
if a.isDefined) {}
但在这种情况下我不会使用我的功能。
答案 0 :(得分:4)
您可以编写自己的扩展功能,例如:
def extendedWhile[T](condFunc: => Option[T])(block: T => Unit): Unit = {
val a = condFunc
if (a.isDefined) {
block(a.get)
extendedWhile(condFunc)(block)
}
}
可以用作:
def rand =
if ((new scala.util.Random).nextFloat < 0.4) None
else Some("x")
extendedWhile(rand) {
x => println(x)
}
// prints out x a random amount of times
这个extendedWhile
函数是尾递归的,因此它通常应该与常规while循环一样高效。
答案 1 :(得分:0)
我不确定我喜欢这个,但是这样做的一种方法是将变量定义为循环外的'var'。
$this->form_validation->set_rules('e_comment', 'Comments', 'required|alpha');
答案 2 :(得分:0)
For fore实际上是foreach,map和flatMap的语法糖。
所以你上面的代码去了:
someCollection.map { a=> f(a)}.foreach {b => ... //something using b}
现在,虽然不是一个贬义,而是一个实际的命令式句法结构。
所以你能做的最好就是
var a = true
while (a) {
a = someFunction (a)
}
在实践中,我从未发现自己在使用while,而是使用高阶函数:比如
input.takeWhile(_ != '').foreach { //do something }