我如何打破一个循环?
var largest=0
for(i<-999 to 1 by -1) {
for (j<-i to 1 by -1) {
val product=i*j
if (largest>product)
// I want to break out here
else
if(product.toString.equals(product.toString.reverse))
largest=largest max product
}
}
如何将嵌套for循环转换为尾递归?
来自FOSDEM 2009 Scala Talk http://www.slideshare.net/Odersky/fosdem-2009-1013261
第22页:
中断并继续
Scala没有它们。为什么?
它们有点迫不得已;最好使用许多较小的函数
发布如何与闭包交互。
他们是不需要的!
怎么解释呢?
我是Scala的新手,但是这样可以避免抛出异常和重复方法:
object awhile {
def apply(condition: () => Boolean, action: () => breakwhen): Unit = {
while (condition()) {
action() match {
case breakwhen(true) => return ;
case _ => { };
}
}
}
case class breakwhen(break:Boolean);
像这样使用它:
var i = 0
awhile(() => i < 20, () => {
i = i + 1
breakwhen(i == 5)
});
println(i)
如果你不想断:
awhile(() => i < 20, () => {
i = i + 1
breakwhen(false)
});
我遇到了类似下面代码的情况
for(id<-0 to 99) {
try {
var symbol = ctx.read("$.stocks[" + id + "].symbol").toString
var name = ctx.read("$.stocks[" + id + "].name").toString
stocklist(symbol) = name
}catch {
case ex: com.jayway.jsonpath.PathNotFoundException=>{break}
}
}
我正在使用一个java库和机制是ctx。read在找不到任何东西时抛出异常。
我被困在这样的情况中:当抛出异常时,我必须打破循环,但是scala.util.control. break .break使用异常来打破循环,并且它在catch块中,因此它被捕获。
我有一个丑陋的方法来解决这个问题:第一次执行循环,并获得实际长度的计数。
然后用它来做第二个循环。
当你使用一些java库时,从Scala中解脱出来并不是那么好。