2016-09-10 16 views
0

我不明白這種行爲。我想檢查一個值是否在網格上創建的圓圈上(作爲數組)。定義圓的兩側..Scala中的迭代器值與vals緩存值

val circleLeft = Vector(5,14,23..) 
val circleRight = Vector(5,16,27,..) 

我在檢查下面的函數這個條件。 與第一個:

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    while (l.hasNext && r.hasNext) { 
    if(idx < r.next && idx > l.next) return true 
    } 
    return false 
} 

它返回總是如此。有了這個第二個

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    while (l.hasNext && r.hasNext) { 
    val x1 = r.next 
    val x2 = l.next 
    println(x2,x1) 
    if(idx < x1 && idx > x2) return true 
    } 
    return false 
} 

它可以正常工作,即insideCircle(15)=真,insideCircle(17)= FALSE

有什麼不同這裏..?

回答

4

&&被稱爲短路方法(在斯卡拉它是用名稱參數實現的)。在您的第一個示例中,l.next僅在idx < r.next時執行。在第二個示例中,始終執行l.next

UPDATE

我建議更多的功能方式:

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    r.zip(l).find { 
    case (x1, x2) => 
     idx < x1 && idx > x2 
    } 
    .isDefined 
} 
+0

所以,使其AND條件我應該關閉括號之間的兩個條件?編輯: 美麗,謝謝! – LowFieldTheory

+0

不知道我理解你的問題,你需要在調用'&&'之前_evaluate_和'.next's。比較'{println(「left」); false} && {println(「right」); true}'和'{println(「left」); false}&{println(「right」);真正的''('&'不是短路方法) –

+0

「你需要在調用&&前先評估兩個.nexts」現在我明白了,ok – LowFieldTheory