NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Iterator patterns in Ruby

差出人: TAKAHASHI Masayoshiさん
送信日時 2001/09/17 20:11
ML.NO [DP/ML:0997]
本文:

高橋征義です。長文失礼します(_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)
@… = bookshelf
@… = 0
end

def has_next?()
@… < @…()
end

def next()
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@…

添付:
 読み込み中...

このメールには下記のメールが返信されています:

【PR】壁紙メーリスレシピ予定調整ゲーム