kaihou999の日記: Visitor
どなたかがRubyでVisitorがどのように実装されているか…という
話をしていたのですが、手元にデザインパターンの本が無かったので、
自宅に帰って確認してしまいました。
しかし…アレは誰だったんでしょう。お心当たりの方、メールで
名乗り出て頂くとうれしいのですが…。
以前、「オペレータを加える」の意味がわからなくて、Visitorは
外部Iteratorだ…と勘違いしてましたが、今回、ちょっと考えたら、
それは間違いだと気づきました(苦笑
そんな調子ですから、間違っているかもしれませんし、また、全ての
人の日記を読んでないので、どなたかが答えているかも知れませんが。
閑話休題。
RubyでVisitorがeachと表現されていて、あれ? っと思ったとの
事ですけども、Rubyではeach内の操作は、yieldで行っています。
value.each{|x, y, z ...|
...
}
のような形です。
さて、これはどう実装するかというと、
class Klass
def each()
....
yield x ....
....
end
end
という形です。
ここで、yieldがどういう動きをするかというところが、今回の
主題になるかと思うのですが、yieldはただ単に、複数の引数を渡して
Iteratorを実現させるだけでなく、その戻り値なるものを取得できる
ようになっています。
class Klass
....
def each()
....
a = yield(x ....)
....
end
....
end
a = Klass.new
a.each{|x ...|
x * 2
}
こんな形で、分かりにくいですが、perlで $_ に突っ込むときにやる
方法と同じ手法で、戻り値を指定します。
とまぁ、簡単で具体的な話だけでおわらしてしまったのですが、Ruby
でのEachなどの使い方、こんな方法もあるということで。