感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

【プログラミング 39時間目】Ruby クラスの概念とかメソッド、アクセッサとか。

スポンサーリンク


たのしいRuby。今日はクラスの勉強。やっとオブジェクト指向っぽい部分に入ってきました。
こういうの、1年前の自分だったらさっぱりだったろうなぁと感慨深く思う。

Javaで、オブジェクト指向に従って書かれたソースを仕事や自宅の勉強でずっと読んだり書いたりしてきたから、こうやって早く理解できるようになったんだと思う。

今まで進んでるのか立ち止まっているのかよくわからなかったけれど、積み重ねた時間は無駄じゃなかった。

今日の日経にも書いてあった。


小さいことを積み重ねるのが、とんでもないところへ行くただひとつの道だと思っていますイチロー(プロ野球選手)



たのしいRubyのまえがきにもあるけれど、

Enjoy Programming!!

の気持ちを忘れずに、コツコツ頑張っていきたい。


★★★

■アクセスメソッドの定義
・attr_reader :name →参照のみ可能
・attr_writer :name →変更のみ可能にする
・attr_accessor :name →参照と変更の両方を可能にする

インスタンスメソッドの中で、メソッドのレシーバ自信を参照するにはselfという特別な変数を使う

def test_name
	name = "Test"
	self.name = "Test"
end

上記の例だと、「name = "Test"」と書いても「name」というローカル変数が作られるだけ。
この場合はレシーバを明示する必要がある。
Javaでいうとthisみたいなものなのかな?

■クラスメソッド
クラスメソッドはクラスそのもの(クラスオブジェクト)をレシーバとするメソッドのこと。

def クラス名.メソッド名 〜  end

Javaでいうとstaticメソッドみたいなもの?

クラスメソッドの名前の表記は2通りある。

クラス名.メソッド名
クラス名::メソッド名

「@@」で始まる変数はクラス変数。
クラス変数とは、そのクラスのすべてのインスタンスで共有できる変数のこと。
定数と似ているけれど、クラス変数は何度でも変更することができる。

クラス変数を使用したサンプル

class MugenUp
	@@life = 1
	
	def MugenUp.getLife
		@@life
	end
	
	def initialize(myplayer="Mario")
		@player = myplayer
	end
	
	def lifeUp
		@@life += 1
		print "Your Life is ", @@life , " It's me! ", @player ,"!!\n"
	end
end

mario = MugenUp.new("Mario")
luige = MugenUp.new("Luige")
peach = MugenUp.new("Peach")

mario.lifeUp
luige.lifeUp
peach.lifeUp

p MugenUp.getLife
		

結果は以下のとおり

Your Life is 2 It's me! Mario!!
Your Life is 3 It's me! Luige!!
Your Life is 4 It's me! Peach!!
4

■メソッドの呼び出しを制限する

public:メソッドをインスタンスメソッドとして使えるように公開する
private:メソッドをクラスの内部だけで使えるようにする(レシーバを指定して呼び出せないようにする)
protected:メソッドをクラスの内部から使えるようにする。また、同一クラス内ではインスタンスメソッドとしても使えるようにする。

protectedは、同一クラス(とそのサブクラス)からはインスタンスメソッドを呼び出せても、それ以外の場所からは呼び出せないようにする。


■継承する
継承の構文
class クラス名 < スーパークラス
クラスの定義
end

さっきの上の例で使った[MugenUp]クラスを継承した例

class MugenUp
	@@life = 1
	
	def MugenUp.getLife
		@@life
	end
	
	def initialize(myplayer="Mario")
		@player = myplayer
	end
	
	def lifeUp
		@@life += 1
		print "Your Life is ", @@life , " It's me! ", @player ,"!!\n"
	end
end

class TwoUp < MugenUp
	#override
	def lifeUp
		@@life += 2
		print "Your Life is ", @@life , " It's me! ", @player ,"!!\n"
	end
end

mario = TwoUp.new("Mario")
luige = TwoUp.new("Luige")
peach = TwoUp.new("Peach")

mario.lifeUp
luige.lifeUp
peach.lifeUp

p MugenUp.getLife
p TwoUp.getLife

結果は・・・

Your Life is 3 It's me! Mario!!
Your Life is 5 It's me! Luige!!
Your Life is 7 It's me! Peach!!
7
7

ちゃんと「2」ずつ増えていますね。