Java.use(better); Episode#01 拡張可能な for 文(1)

前の記事次の記事
Java.use(better);


Episode#01

拡張可能な for 文(1) -- for と別れる50の方法



《関連記事》

Jython の場合

for..in 文の対象に、特殊メソッド __iter__ を規定しないものを指定すると、

    for e in File("bin/apple/lang"):
TypeError: 'java.io.File' object is not iterable

実行時にエラーとなります。そこで、特殊メソッド __iter__ を再定義して、

    for e in ExFile("bin/apple/lang"):
        print e

for..in 文を利用すると、次の結果が得られます。

$ jython _Tips.py 
_Tips.class
App.class
ExFile.class
ExTokenizer$1.class
ExTokenizer.class
$ 

これは、次のように実現します。

class ExFile:
    def __init__(self, pathname):
        self.seq = File(pathname).list()
    def __iter__(self):
        for e in self.seq: yield e

特殊メソッド __iter__ を再定義して、各要素を巡回できるようにします。

これで、ポリモフィズムを実践する準備が整いました。

    for seq in [
        ["AB","C","DEF"],
        StringTokenizer("This is a pen."),
        ExFile("bin/apple/pie"),
    ]:
        print ">>> %s"%seq.__class__.__name__
        for e in seq:
            print e

このとき、__iter__ を規定した任意の seq に対して、for..in 文の本体にあるコードの断片は有効です。つまり、for..in 文は「ポリモフィズム」を体現しています。

前述したものを実行すると、次の結果が得られます。

$ jython _Tips.py 
>>> list
AB
C
DEF
>>> StringTokenizer
This
is
a
pen.
>>> ExFile
_Tips.class
App.class
ExFile.class
ExTokenizer$1.class
ExTokenizer.class
$ 

《付記》Jython では、StringTokenizer についても、

    from java.util import StringTokenizer

とするだけで、for..in 文と組み合わせて利用できます。≡

 ↑ TOP

update*13/01/04 21:13:19