Ruby version: 1.8.7
1.クラス定義とメソッド定義
クラスの定義の仕方はJava及びPHPと大差はない。 しかしメソッド定義に関しては若干の違いがある。
class Hoge
def initialize()
end
end
上記のコードを一行づつ見ていこう
class Hoge
これはクラス定義だ。 Hogeという名前のクラスを作ってる。
def initialize()
これはメソッド定義。 def というのはメソッドであるという宣言だ。 initialize というのはメソッド名だが、この名前はコンストラクタとして予約されている。 すなわち new した時 (インスタンス生成時) に呼ばれるメソッドを定義してるのだ。
もちろんコンストラクタが不要の場合は定義しなくてもよい。
2.戻り値
Ruby は基本的に全てのメソッドは何かしらの値を必ず返す事になっている。
しかし必ず return を書けというわけではない。
どういう事かコードを見てみよう
class Hoge
def fuga()
return 1 + 1
end
def hago()
1 + 1
end
end
さてこのコードの fuga メソッドを呼び出したとする。
当然 1 + 1 の結果である 2 が戻り値として返される。
それでは hago メソッドを呼び出した時はどうだろう。
これも 1 + 1 の結果値である 2 が戻り値として返される。
Ruby は return が明示されてない場合、最後に評価した結果を返すのである。
評価とは実行された結果の事なので必ず式の結果であるとは限らない。
3.クラスのインスタンス化
クラスをインスタンス化する方法はJavaやPHPとは少し異なっている。
たとえば
Javaでは
Hoge hoge = new Hoge();
PHP
$hoge = new Hoge();
このように new クラス名(引数) となるが Ruby だとこうなる
hoge = Hoge.new()
new 自体がクラスメソッド (static メソッド) なのだ。
newというメソッドの戻り値がそのクラスのインスタンスとなる。
ここでPHPな人には注意だが、メソッドの呼出は -> ではなく . をつかう。
決して文字列を連結しているわけではない。
4.変数の種類
Ruby の変数は大きく分けて 3 つある
- ローカル変数
- インスタンス変数
- クラス変数
- グローバル変数
それぞれを一つづつ見ていこう。
ローカル変数とはメソッド内や特定のブロック内で共通の変数である。
JavaやPHPをやっている人に得に説明する必要はないだろう。
class Hoge
def fuga()
hoge = "Fuck"
end
end
hago がローカル変数である。
この場合は def のブロック内すなわち def と対になる end まで有効となる変数である。
インスタンス変数とはインスタンス内で共通のスコープをもつ変数の事である
JavaやPHPで言うところの this.hoge や $this -> hoge の事である。
まずはコードを見て見よう
class Hoge
def set(fuga)
@hago = fuga
end
def get()
@hago
end
end
@hago がインスタンス変数である。
@がインスタンス変数である事の宣言であり hago が変数名である。
このクラス内において set で呼ばれている hago と get で呼ばれている hago は同じポインタを参照している事になる。
クラス変数とはそのクラス内で共通のスコープを持つ変数である。
Java でいうところの static 変数である。
class Hoge
def fuga(hago)
@@hago = hago
end
end
まずは上記のサンプルコードを見てみよう。
@@hago というのがクラス変数である。
@@ がクラス変数である事の宣言であり hago は変数名なのだ。
それでは @@ がついていない引数の hago はなにか。
これはローカル変数である。
ローカル変数については後述する。
クラス変数はクラスで共通なので
class Hago
def set()
@@hago = "hoge"
end
def get()
@@hago
end
end
hago1 = Hago.new
hago2 = Hago.new
hago1.set("fuga")
hago2.get() #=> fuga
このように同じクラスのインスタンスであれば同じポインタの変数を扱っている事になる
実行するスクリプトおよびアプリケーション間で共通となる変数である。
PHPでいう所の $GLOBALS の事である。
コードを見てみよう
class Hoge
def fuga()
$hago
end
end
class Fuck
def set(fuga)
$hago = fuga
end
def get()
Hoge.new.fuga()
end
end
fuck = Fuck.new
fuck.set("Fack Method")
fuck.get() #=> Fack Method
ちょっと長くなってしまったが $hago がグローバルメソッドである。
$ がグローバルメソッドの宣言であり hago が変数名となる。
クラスやメソッドの垣根を越えて共通のポインタを参照しているため set で入力した値が Hoge クラスのインスタンスから取得できるのだ。
これでひとまずの基本的なクラスとメソッドの説明は終りである。 次はイテレーションや演算子など実際の処理でよく使うところを見ていこう