イテレータを定義する・まずは未定義のクラスの例
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
イテレータを自分で作ることにチャレンジしてみます。
自分で定義したクラスに、イテレータを定義できるのですが、Ruby独特の部分ですので難しいです。
まだ、よく分かっていませんけど、とりあえずイテレータを作る前に、イテレータ未定義のクラスの例。
スポンサーリンク
require "pp"
# 1人のプロフィールのクラス。名前、年齢、出身国
class Prof
attr_accessor :name, :age, :country
def initialize(name, age, country=nil)
@name = name
@age = age
@country = country
end
end
# プロフィールのリストのクラス
class ProfList
def initialize()
@proflist = Array.new
end
# 新しい人を加える
def add(prof)
@proflist.push(prof)
end
# 人数を返す
def length
@proflist.length
end
# n番目の人を別の人に入れ替える
def []=(n, prof)
@proflist[n] = prof
end
# n番目の人を返す
def [](n)
@proflist[n]
end
# リストからプロフィールを削除
def delete(prof)
@proflist.delete(prof)
end
end
# テストルーチン
proflist = ProfList.new
# プロフィールをいくつか作る
p1 = Prof.new("Tom William", 45, "America")
p2 = Prof.new("De Pedoro", 23, "Spain")
p3 = Prof.new("Naoko Yamada", 37, "Japan")
# プロフィールリストに人(プロフィール)を追加
proflist.add(p1)
proflist.add(p2)
proflist.add(p3)
pp proflist # proflistは3人のプロフィールからなるオブジェクト
puts proflist[1].name
# プロフィールを1人ずつ表示
proflist.length.times{|i|
puts "#{proflist[i].name} - age:#{proflist[i].age} country:#{proflist[i].country}"
}
# プロフィールを1人ずつ表示。
# eachメソッドがエラー。proflistはProfListクラスのインスタンス。
proflist.each{|prof|
puts "#{prof.name} - age:#{prof.age} country:#{prof.country}"
}
上記の例ですと、最後のeachメソッドによるイテレータ処理の部分がエラーになります。
こんな風に処理ができれば、コーディングも楽になるのですが、エラーになってしまいます。
proflistはProfListクラスのインスタンスですので、ProfListクラスの中に自分でイテレータを定義する必要があります。
実行結果。
#<ProfList:0x29a2ca0 @proflist= [#<Prof:0x29a2b4c @age=45, @country="America", @name="Tom William">, #<Prof:0x29a2b10 @age=23, @country="Spain", @name="De Pedoro">, #<Prof:0x29a2ad4 @age=37, @country="Japan", @name="Naoko Yamada">]> De Pedoro Tom William - age:45 country:America De Pedoro - age:23 country:Spain Naoko Yamada - age:37 country:Japan book.rb:65: undefined method `each' for #<ProfList:0x29a2ca0> (NoMethodError)
スポンサーリンク
>> 次の記事 : クラス内にイテレータ定義
<< 前の記事 : grepとsort_byメソッド・Enumerableモジュール
- - 関連記事 -
- 引数のあるイテレータ
- イテレータ定義で複数の引数をブロックに渡す
- クラス内にイテレータ定義
- grepとsort_byメソッド・Enumerableモジュール
- ファイルをイテレータ処理
- イテレータとは
- yield でイテレータを独自に定義
スポンサーリンク