2013-02-06

Groovy イイ!のあとに最初につまづいた。
「each が止まらない。。。」

問題


Groovy のリストで each() メソッドを使用するとreturnやbreakで終了せず、すべてのイテレータが処理される。
あれ、each が止まらない。
これは、Javaやpython,ruby の動きから想定していると予想外の挙動。。。



解決方法

find() を使う。 以下のページで解決策があった。結構有名な話みたい。 メタクラスでbreakを挿入したり、例外投げて止めるなどもあるみたい。 でも、find が一番シンプル。

  • ちなみに for ならとめられる
for(i in 0..10){ hogehoge } 



参考リンク
Groovy's each does not exit when using return

勉強になりました。ありがとうございます。




実験



hoge.each() 予想外の動き


うわーん。return で処理がとまらない。。。

myList = (1..10)

def notBreak(yourList) {
    yourList.each { list ->
        if(list == 5) {
            return true
        } else {
            return false
        }
    }
}

//assert existFiveBadCase(myList) == true
assert notBreak(myList) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]



hoge.find()


find 中で return trueするとそこで処理がとまる。
下のコードはまだ冗長だけど。数字の '5' を探す関数。

myList = (1..10)

def doBreak(yourList) {
    def isExist = false
    yourList.find { list ->
        if(list == 5) {
            isExist = true
            return true
        }
    }
    return isExist
}

assert doBreak(myList) == true

0 件のコメント:

コメントを投稿