2017-10-10 45 views
1

我嘗試實施循環和無限循環檢查,因此,如果週期執行超過CONST時候,它會拋出異常:如何實現類似的功能,而週期

val MAX_CYCLES = 1000000 

@throws(classOf[InfinityLoopException]) 
def guardedWhile(condition:() => Boolean)(body:() => Unit): Unit = { 
    var cnt = 0 
    while (condition.apply()) { 
    body.apply() 
    if (cnt > MAX_CYCLES) throw new InfinityLoopException() 
    cnt += 1 
    } 

} 

class InfinityLoopException() extends RuntimeException("Loop executed " + MAX_CYCLES + " cycles") 

它的工作原理,但我希望有非函數簽名像經典的同時:

var i = 0 
guardedWhile(i < 5){ 
    println(i) 
} 

現在我有:

var i = 0 
guardedWhile(() => i < 5)(() => { 
    println(i) 
    i += 1 
}) 

回答

3

將參數更改爲按名稱。

def guardedWhile(condition: => Boolean)(body: => Unit): Unit = { ... 

然後直接引用它們。

while (condition) { 
    body 
    . . . 

調用名稱是指每次引用它們時都會重新評估它們。

相關問題