Rubyでは、
- クラスはclassキーワードで定義
- インスタンスメソッドはクラス内でdefキーワードを使って定義
- 新規インスタンスはクラスメソッドnewで作成
- newメソッドを定義する必要はない
- コンストラクタは定義できないが、代わりにinitializeメソッドがnew実行時に呼ばれる
- インスタンス変数は頭に@を付ける
- インスタンス変数の宣言は不要、というか宣言なんて無い
- 未初期化のインスタンス変数から読み出し可能、nilが入っている
- クラス変数はアタマに@@
- 未初期化のクラス変数は読めない(例外発生)
class C def initialize @v = ほげ end def m p @v end end c = C.new c.m # "ほげ"と表示
Javaでは同じ名前のクラス、メソッドがあった場合、コンパイルに失敗する。Rubyでは、同名のクラスがあると、クラス定義の続きになる。その中に同名のメソッドがあった場合、後から読み込んだメソッドで上書きされる。
class Hoge def a p "hoge" end end hoge = Hoge.new hoge.a # "hoge"と表示 class Hoge def a p "hogehoge" # 先のaメソッドは上書きされる end end hoge.a # "hogehoge"と表示
これはだめ
class Fuga end class Piyo end class Hoge < Fuga end class Hoge < Piyo end
HogeクラスをFugaのサブクラスと先に定義した場合は、Piyoのサブクラスとして上書きすることはできない。