Rubyを学んでみる 第3回

クラスとメソッド

ここからは非常に大切なところだな。
これがわからんとオブジェクト指向も何もできない。
だがしかしJavaやPHPで多少かじってきたから少しはわかるだろう。

クラスの定義

クラスはオブジェクトの雛形です。
まあ、クラスからインスタンスを作って・・・・という流れはJavaでやりましたので、
なんとなくわかってはいるつもり。
ここではプログラマー[programmer]というクラスを定義してみよう。
プログラマーには名前があり、プログラミング[programming]する機能を持たせる。

class Programmer
	・・・ここにクラスの内容を定義します
end

endを忘れないようにしないとな。今までやってきた言語とちょっと違うな。
なんか{}とかで囲まれていないと不安になる。

インスタンスの生成

クラスからインスタンスを作り出すといういつもの流れ。
さあ、どういう感じなんだRuby。

p = Programmer.new

JavaやPHPと違ったあああああああああ
.newが最後につくパターンか。これは間違えそう。

メソッドの定義

クラスに機能を追加するメソッドの定義の仕方は・・・

class Programmer 
	def programming
		'プログラミングします'
	end
end

・・・ほう。def。まあ、なんとなくわかるわ。
def~endの間がメソッドなわけね。defの後にメソッド名を書くと。
defはdefineの略で「定義する」という意味。
あー。これですっきりした。defineね。ふむふむ。
定義したメソッドは「インスタンス名.メソッド名」で呼び出す。
これは他の言語と同じだな。
メソッドを呼び出すと、メソッドの中で定義した式の返り値を取得することができる。

メソッドの呼び出し

d = Programmer.new
text = d.programming

おお。これはわかりやすいな。
オブジェクト指向オブジェクト指向。

初期化処理とローカル変数とインスタンス変数

インスタンスの生成時に、あらかじめ処理しておきたいことを定義することができます。ほう。コンストラクタ的な?

class Programmer
	def initialize(name)
		@name = name
	end
end

このメソッド名を使って定義した内容がインスタンス生成時に処理される。
やはりコンストラクタか。
この例ではインスタンス生成時に名前(name)を設定できるようにしている。インスタンスごとにデータを保持するためにインスタンス変数(@name)を使います。と。

pg_a = Programmer.new('maro')
pg_b = Programmer.new('まろ')

こんな感じね。なるほど。

クラス属性へのアクセス

クラスに定義したインスタンス変数の内容を参照したり、書き換えたりするためのメソッドを定義します。下記のようなメソッドを定義するとクラスの中で定義されたインスタンス変数へ「インスタンスオブジェクト.name」でアクセスできる。

class Programmer
	def initialize(name)
		@name = name
	end
	
	def name
		@name = name
	end
	
	def name = (name)
		@name = name
	end
end

ほうー。なるほど?ごめん、ちょっと良く分からないや。
クラスに定義したインスタンス変数の内容を参照したり・・・書き換え。
???あかん、理解できてないな。
もうひとつの例を見てみよう。
属性へのアクセス定義を簡単に。

class Programmer
	attr_accessor :name
	def initalize(name)
		@name = name
	end
end

えっ。上のコードと同じ意味らしいが。
http://ref.xaio.jp/ruby/classes/module/attr_accessor
リファレンスを参照してみよう。
その前にちょっと待ってね。
インスタンス変数をもう少し理解してみるわ。
http://www.rubylife.jp/ini/class/index4.html

class Car
  def setName(str)
    @name = str
  end
  
  def dispName()
    print(@name, "¥n")
  end
end

car = Car.new()
car.setName("crown")
car.dispName()

ああ、これめっちゃわかりやすいわ。すごいわこれ。
引用:クラスからは複数のオブジェクトを作成することが出来ますが、インスタンス変数はオブジェクト毎に異なる値を割り当てることが出来ます。

class Car
  def setName(str)
    @name = str
  end
  
  def dispName()
    print(@name, "¥n")
  end
end

car1 = Car.new()
car1.setName("crown")

car2 = Car.new()
car2.setName("civic")

car1.dispName()
car2.dispName()

なるほどなるほど。非常に分かりやすいですはい。
前のコードを見てみよう。
インスタンス変数はメソッド外でも使う事が出来るって言う事なのかね。
ローカル変数だと値は消えてしまう・・・・。
これは使ってみないとわからんな。
一旦飛ばしていこう。Javaの時にやったはずなのになあ。
またJava勉強してみようかな。

クラスの継承

JavaやPHPと同じでクラスの継承ができるようだ。

class Programmer
	def java_coding
		"#{@name}はJavaコーディングします"
	end
end

class WebProgrammer < Programmer
	def php_coding
		"#{@name}はPHPコーディングします"
	end
end

wpg = WebProgrammer.new('maro')
text_a = wpg.java_coding
text_b = wpg.php_coding

こういうことね。クラスの継承は何となく理解した。
継承先のクラスのメソッドも使えるよってことね。

クラス変数とクラスメソッド

class Programmer
	# なんらかの定義
end

class WebProgrammer < Programmer
	@@count = 0
	def initialize(name)
		@@count += 1
		super
	end

	def self.count
		@@count
	end
end

wpg_a = WebProgrammer.new('maro')
count = WebProgrammer.count #countは1
wpg_b = WebProgrammer.new('まろ')
count = WebProgrammer.count #countは2

同じクラスから生成されたオブジェクト間でデータを共有したい場合にクラス変数(先頭に@@がついた変数)を使用します。
また、メソッドについても今はインスタンスオブジェクトから呼び出していましたが、「クラス名.メソッド名」で実行することのできるクラスメソッドというメソッドがあります。

クラスメソッドの定義の仕方

「def クラス名.メソッド名 ~ end」
「def self.メソッド名 ~ end」

今までの属性データはインスタンスごとにデータを持つことのできるインスタンス変数でしたが、これで同じクラスから生成されたオブジェクト間でデータのやり取りができる・・・ということ。
上の例だと何回インスタンスが生成されたかわかるってことですか。そういう事ですね。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください