クラス変数なるもの-1. ヘンな記号の変数-

ある日の昼下がり、今日もパートに出かけたワタシは特に急いですることもなく、愛子井研究所のパソコンのファイルを空けて眺めたりしていた。
すると博士が書いたに違いない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ページ)。
ということで、トップレベルに「オブジェクトの名前が違うだけであとは同じ」ような処理が並んでしまったのだ。さて、どうするか?

次へ

目次へ

このページの目次へ