while循环扩展范围scala

时间:2015-06-26 05:03:42

标签: scala loops

在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) {} 

但在这种情况下我不会使用我的功能。

3 个答案:

答案 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 }