| 件名: | Iterator patterns in Ruby |
|---|---|
| MLNo. | [DP/ML:0997] |
| 差出人: | TAKAHASHI Masayoshiさん |
| 送信日時: | 2001/09/17 20:11 |
| 本文: |
高橋征義です。長文失礼します(_o_)
Rubyについて、話だけでは何なので、結城さんの『パターン入門本』の サンプルをRubyで書いてみました。 『入門本』の最初のパターン、イテレータパターンのサンプルをそのまま Rubyで書くと、以下のようになります。 # 行数を減らすために「;」を多用しています。ちょっと見辛いかも。 ###--------------------------------------------- iterator_sample.rb class Book def initialize(name); @… = name; end attr_reader :name end class BookShelf def initialize(); @… = Array.new(); end def book_at(index); return @…[index]; end def append_book(book); @… << book; end def length(); return @…; end def iterator(); return BookShelfIterator.new(self); end end class BookShelfIterator def initialize(bookshelf) @…Shelf = bookshelf @… = 0 end def has_next?() @… < @…Shelf.length() end def next() book = @…Shelf.book_at(@…) @… += 1 return book end end ### main if __FILE__ == $0 bookShelf = BookShelf.new() bookShelf.append_book(Book.new("Around the World in 80 Days")) bookShelf.append_book(Book.new("Bible")) bookShelf.append_book(Book.new("Cinderella")) bookShelf.append_book(Book.new("Daddy-Long-Legs")) it = bookShelf.iterator() while it.has_next? book = it.next() print book.name, "n" end end #--------------------------------------------------------------------- もっとも、これは全然Rubyっぽくありません。そこで、 * メソッドをRubyっぽい名前/形にする * イテレータをRuby標準の(インターナル)イテレータにする * returnを省略する(最後に評価した値が返り値になります) などの変更を行うと、以下のようになります。 ###--------------------------------------------- iterator_sample3.rb class Book def initialize(name); @… = name; end attr_reader :name end class BookShelf def initialize(); @… = Array.new(); end def [](index); @…[index]; end def <<(book); @… << book; end def length(); @…; end def each(); @…{|book| yield(book)}; end end ### main if __FILE__ == $0 bookShelf = BookShelf.new() bookShelf << Book.new("Around the World in 80 Days") bookShelf << Book.new("Bible") bookShelf << Book.new("Cinderella") bookShelf << Book.new("Daddy-Long-Legs") bookShelf.each{|book| print book.name, "n" } end ###------------------------------------------------------------------ さらに、「余計なメソッドが多少あってもいーじゃん」という気分の時は、 BookShelfはArrayのサブクラスにしてしまったりします。そうすると、 以下のようになります。クラス定義部分は10行足らずです。 # いやまあ、Arrayの機能をそのまま使ってるからなんですが(^^;; ###--------------------------------------------- iterator_sample4.rb class Book def initialize(name) @… = name end attr_reader :name end class BookShelf < Array; end ### main if __FILE__ == $0 #### (ここは iterator_sample3.rb と同じなので略) end #-------------------------------------------------------------------- ……とまあ、Rubyでのプログラミングはこんな感じなのでした。 多少なりとも雰囲気が伝われば幸いです。 高橋征義 (TAKAHASHI Masayoshi) Email:maki@… |
|---|---|
| 添付: |
このMLメールには下記のMLメールが返信されています:
読み込み
中...| <<0996:Re: [DP/ML:0995] Re:Visitorとダブル ディスパッチ | 0998:Re: [DP/ML:0997] Iterator patterns in Ruby>> |










