ある日の昼下がり、今日もパートに出かけたワタシは特に急いですることもなく、愛子井研究所のパソコンのファイルを空けて眺めたりしていた。
すると博士が書いたに違いないRubyのプログラムが見つかり、ざっと眺めたらあーらこの変数「@」記号が二つもついてんじゃん。
愛子井博士ったら、コード打ち間違ってんのヘヘーん。と思ったら間違いじゃないんだそうだ。
ボケナス呼ばわりされたハライセか、愛子井オヤジめ、このワタシにプログラムを書いてみろとはナメたまねを。
よし書いてやろうじゃないかということで、リスト1のようなreport1.rbだ。
リスト1 report1.rb
#-*- coding: shift_jis -*- #report1.rb #クラスEnemyのオブジェクトを1つ作成するごとに #その費用を総費用に加えて表示する ###クラスEnemyの定義### class Enemy def initialize(name, cost) @name=name @cost=cost end def name @name end def cost @cost end def report #オブジェクトひとつの作成費用 puts "#{name}作成費用:#{cost}" end end ###トップレベル### def total_cost(total) puts "総費用:#{total}" end total=0 e1=Enemy.new("E-1", 5000) total+=e1.cost e1.report total_cost(total) e2=Enemy.new("E-2", 3000) total+=e2.cost e2.report total_cost(total) e3=Enemy.new("E-DX", 8500) total+=e3.cost e3.report total_cost(total) #e1-e3について、繰り返せるような繰り返せないような...
コレ、実行結果は以下の通り。
E-1作成費用:5000
総費用:5000
E-2作成費用:3000
総費用:8000
E-DX作成費用:8500
総費用:16500
できたことはできたのだが、なんとなくダサ。
なぜか?それは、3つのEnemyオブジェクトが共通に使う変数totalの置き場所だ。
Enemyクラスのオブジェクトに関する変数なんだからクラスEnemyの定義の中に起きたいのは海千山千だ(日本語が違う)。
だが、インスタンス変数@totalみたいにすると、オブジェクトによってバラバラの値しか保持できない。
それでトップレベルに置いたのだが、トップレベルのローカル変数を使う処理はうっかりメソッドにまとめられない(スコープの話、本書217ページ)。
ということで、トップレベルに「オブジェクトの名前が違うだけであとは同じ」ような処理が並んでしまったのだ。さて、どうするか?