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