読者です 読者をやめる 読者になる 読者になる

delalunaofficedaysのブログ

WORDPRESSとEC CUBEくらいしか触っていないWEBデザイナーの日記とかメモ。

Rubyを学んでみる 第3回

クラスとメソッド

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

クラスの定義

クラスはオブジェクトの雛形です。 まあ、クラスからインスタンスを作って・・・・という流れはJavaでやりましたので、 なんとなくわかってはいるつもり。 ここではプログラマー[programmer]というクラスを定義してみよう。 プログラマーには名前があり、プログラミング[programming]する機能を持たせる。 [ruby] class Programmer ・・・ここにクラスの内容を定義します end [/ruby] endを忘れないようにしないとな。今までやってきた言語とちょっと違うな。 なんか{}とかで囲まれていないと不安になる。

インスタンスの生成

クラスからインスタンスを作り出すといういつもの流れ。 さあ、どういう感じなんだRuby。 [ruby] p = Programmer.new [/ruby] JavaPHPと違ったあああああああああ .newが最後につくパターンか。これは間違えそう。

メソッドの定義

クラスに機能を追加するメソッドの定義の仕方は・・・ [ruby] class Programmer def programming ‘プログラミングします’ end end [/ruby] ・・・ほう。def。まあ、なんとなくわかるわ。 def~endの間がメソッドなわけね。defの後にメソッド名を書くと。 defはdefineの略で「定義する」という意味。 あー。これですっきりした。defineね。ふむふむ。 定義したメソッドは「インスタンス名.メソッド名」で呼び出す。 これは他の言語と同じだな。 メソッドを呼び出すと、メソッドの中で定義した式の返り値を取得することができる。

メソッドの呼び出し

[ruby] d = Programmer.new text = d.programming [/ruby] おお。これはわかりやすいな。 オブジェクト指向オブジェクト指向

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

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

[ruby] class Programmer def initialize(name) @name = name end end [/ruby] このメソッド名を使って定義した内容がインスタンス生成時に処理される。 やはりコンストラクタか。 この例ではインスタンス生成時に名前(name)を設定できるようにしている。インスタンスごとにデータを保持するためにインスタンス変数(@name)を使います。と。 [ruby] pg_a = Programmer.new(‘maro’) pg_b = Programmer.new(‘まろ’) [/ruby]

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

クラス属性へのアクセス

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

[ruby] class Programmer def initialize(name) @name = name end

def name
    @name = name
end

def name = (name)
    @name = name
end

end [/ruby]

ほうー。なるほど?ごめん、ちょっと良く分からないや。 クラスに定義したインスタンス変数の内容を参照したり・・・書き換え。 ???あかん、理解できてないな。 もうひとつの例を見てみよう。 属性へのアクセス定義を簡単に。 [ruby] class Programmer attr_accessor :name def initalize(name) @name = name end end [/ruby] えっ。上のコードと同じ意味らしいが。 http://ref.xaio.jp/ruby/classes/module/attr_accessor リファレンスを参照してみよう。 その前にちょっと待ってね。 インスタンス変数をもう少し理解してみるわ。 http://www.rubylife.jp/ini/class/index4.html [ruby] class Car def setName(str) @name = str end

def dispName() print(@name, "¥n") end end

car = Car.new() car.setName("crown") car.dispName() [/ruby] ああ、これめっちゃわかりやすいわ。すごいわこれ。 引用:クラスからは複数のオブジェクトを作成することが出来ますが、インスタンス変数はオブジェクト毎に異なる値を割り当てることが出来ます。 [ruby] 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() [/ruby] なるほどなるほど。非常に分かりやすいですはい。 前のコードを見てみよう。 インスタンス変数はメソッド外でも使う事が出来るって言う事なのかね。 ローカル変数だと値は消えてしまう・・・・。 これは使ってみないとわからんな。 一旦飛ばしていこう。Javaの時にやったはずなのになあ。 またJava勉強してみようかな。

クラスの継承

JavaPHPと同じでクラスの継承ができるようだ。 [ruby] 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 [/ruby] こういうことね。クラスの継承は何となく理解した。 継承先のクラスのメソッドも使えるよってことね。

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

[ruby] 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 [/ruby]

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

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

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

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