Rubyのクラスについてまとめます。
インスタンスとインスタンスメソッド
クラスからインスタンスを生成するにはnew
メソッドを使用します。
クラス内に定義したメソッドはそのインスタンスから呼び出せます。このメソッドをインスタンスメソッドと言います。
クラスにはインスタンスメソッドとしてinitialize
が用意されており、インスタンス化時の処理をここに書くことができます。(不要な場合は省略可)
class Foo
def initialize
p 'initialize!!!'
end
def sample_method
p 'sample_method!!!'
end
end
foo = Foo.new # => "initialize!!!"
foo.sample_method # => "sample_method!!!"
インスタンス変数
- インスタンス内でのみ参照可能な変数で状態を保持できる
- 外から参照するにはアクセサを定義する必要がある
- インスタンス変数の定義は
@bar
のように先頭に@を付ける
class Foo
def initialize
@bar = 'instance!!!'
end
def sample_method
p @bar
end
end
foo = Foo.new
foo.sample_method # => "instance!!!"
インスタンス変数に外部からアクセスする
インスタンス変数に外部からアクセスするには以下のメソッドを追加する必要があります。
- 代入するメソッド
Foo#bar=
- 参照するメソッド
Foo#bar
class Foo
def bar=(value)
@bar = value
end
def bar
@bar
end
end
foo = Foo.new
foo.bar = 'instance!!!' # syntax sugarが用意されており、foo.bar= と書かなくても代入のように書ける
foo.bar # => "instance!!!"
これを簡単にしたのがattr_accessor
でアクセサと呼ばれます。
アクセサを用いることで、上記のようにわざわざメソッドを定義しなくてもこれだけで外部からインスタンス変数を使用することができます。実態はFoo#bar=
メソッドやFoo#bar
メソッドをattr_accessor
が作っているのです。
class Foo
attr_accessor :bar # 引数は可変長のため複数定義が可能 => attr_accessor :bar_a, :bar_b
end
foo = Foo.new
foo.bar = 'instance!!!'
foo.bar # => "instance!!!"
クラスメソッド
インスタンス化せずともクラスに対して直接メソッドを呼び出すことができます。
クラスメソッドの定義はself.sample_method
のようにself.
をメソッド名の前につけます。
class Foo
def self.sample_method
p 'class method!!!'
end
end
Foo.sample_method # => "calss method!!!"
また以下のように class << self..end
の中にメソッドを定義することでも、クラスメソッドとなります。こうすることで複数まとめてクラスメソッドを定義でき、ネストすることでインスタンスメソッドとの区別が明確になります。
class Foo
class << self
def method_bar
p 'class method bar!!!'
end
def method_baz
p 'class method baz!!!'
end
end
end
Foo.method_bar # => "calss method bar!!!"
Foo.method_baz # => "calss method baz!!!"