件名:

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メールには下記のMLメールが返信されています:
[DP/ML:1001] Re: [DP/ML:0997] Iterator patterns in Ruby  さん)
[DP/ML:1002] Re: Iterator patterns in Ruby  (Tatsuhiko Miyagawaさん)
[DP/ML:1010] Iterator patterns in Smalltalk  (SHIMADA Keikiさん)
[DP/ML:1013] Re: [DP/ML:0997] Iterator patterns in Ruby  (OZAWA -Crouton- Sakuroさん)
 読み込み 中...
<<0996:Re: [DP/ML:0995] Re:Visitorとダブル ディスパッチ 0998:Re: [DP/ML:0997] Iterator patterns in Ruby>>
MLメール表示切替 トピック表示 メール表示
MLメール一覧

MLトピック検索:
MLメールの詳細(メール表示)
MLメール表示切替 トピック表示 メール表示
MLメール一覧

メーリングリストでつながる!ひろがる!みんなのHappyコミュニティ!

詳細検索
NOEMBLEM/エンブレムが設定されていません。
デザインパターン・メーリングリスト (3906)
 
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
メンバーリストは非公開です。
メンバーの日記/フォト/動画
メンバーの投稿は非公開です。
 読み込み中...