基本
Rubyのクラスのコンストラクターはinitialize()
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyClass def initialize(val) @property = val end def method(val) return @property + val end end instance = MyClass.new(2) puts instance.method(5) # 7 |
initialize()
ではなくインスタンスメソッド内でプロパティーを定義することもできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass def set_val(val) @property = val end def add(val) return @property + val end end instance = MyClass.new() instance.set_val(3) puts instance.add(4) # 7 |
ただしこの場合には、プロパティーが定義されるメソッドをプロパティーが参照される前に呼んでおかなければならない(そうしないと演算などで未定義でエラーになる)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyClass def set_val(val) @property = val end def add(val) return @property + val end end instance2 = MyClass.new() puts instance2.add(4) # ERROR # in `add': undefined method `+' for nil:NilClass (NoMethodError) |
なので、普通はインスタンス生成時に自動的に呼ばれるinitialize()
内でプロパティーを定義するのが安全。
オーバーロード不可
異なる引数のコンストラクターを意図してオーバーロードすることはできない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
lass MyClass2 def initialize() @member = 0 puts "init-1" end def initialize(n) @member = n puts "init-2" end end instance = MyClass2.new() # ERROR # in `initialize': wrong number of arguments (given 0, expected 1) (ArgumentError) |
上記のコードの場合、後の方で定義したコンストラクターは使える。
1 2 3 |
instance = MyClass2.new(1) # init-2 |
引数のパターンを変えたいときは、デフォルト引数や可変長引数を用いるとよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass3 def initialize(x: 1, y: 2) @x = x @y = y puts "(#{@x}, #{y})" end end instance1 = MyClass3.new() instance2 = MyClass3.new(y: 20) instance2 = MyClass3.new(x: 10, y: 10) # (1, 2) # (1, 20) # (10, 10) |