@ゲー単走部

ローグライク雑記。変愚蛮怒、DCSSなど。

Iteratorパターン

イテレータイテレータってよく聞くけど、要するにこんな感じなんだろう。

class MyList:
    def __init__(self, mylist): # 引数mylistは通常のリストを想定
        self.mylist = mylist

    def getsize(self):
        return len(self.mylist)

    def __getitem__(self, index): # お遊び
        index2 = self.getsize() - 1 - index
        return self.mylist[index2]

    def myiter(self):
        return MyIterList(self)

    def __iter__(self):
        return MyIterList(self)

class MyIterList:
    def __init__(self, mylist): # 引数mylistはMyList型を想定
        self.mylist = mylist # 自フィールドがMyList型インスタンスを参照するようにする
        self.count = 0

    def hasNext(self):
        return self.count < self.mylist.getsize()

    def mynext(self):
        nextvalue = self.mylist[self.count]
        self.count += 1
        return nextvalue

    def __next__(self):
        if not self.hasNext():
            raise StopIteration()
        return self.mynext()


if __name__ == '__main__':
    test = MyList([1, 2, 3, 4, 5])
    for i in range(5):
        print(test[i])
    print('')

    print('myiter_test')
    itertest = test.myiter()
    while itertest.hasNext():
        print( itertest.mynext() )

    print('my__iter__test')
    for i in test:
        print(i)