Rubyのself変数とは
Rubyでは、self変数は特別なキーワードであり、オブジェクト自体を参照するためのものです。selfは、そのコンテキストにおいて「現在のオブジェクト」を表します。つまり、selfを使うことで、オブジェクト内部で自身の属性やメソッドにアクセスできるようになります。
例えば、以下のようなクラスを考えてみましょう。
class Person
attr_accessor :name
def initialize(name)
self.name = name
end
def greet
puts "Hello, I'm #{self.name}!"
end
endこの例では、Personクラスのインスタンスがname属性を持ち、initializeメソッドでその値を設定しています。そして、greetメソッドではself.nameを使って自身のname属性にアクセスし、その値を表示しています。
レシーバーを省略した場合のself
一般的に、Rubyではメソッドを呼び出す際、明示的にレシーバーを指定する必要があります。例えば、person.greetというように、personがgreetメソッドのレシーバーです。
しかし、レシーバーを省略してメソッドを呼び出すと、Rubyは暗黙的にselfをレシーバーとして扱います。つまり、person.greetはselfがpersonであるかのように振る舞います。
selfを省略できない場合
一方、name=という特殊なメソッド(セッターメソッド)においては、selfを省略することはできません。例えば、以下のようなメソッドを考えます。
class Person
attr_accessor :name
def set_name(name)
name = name
end
endこの例では、set_nameメソッド内で引数のnameをそのままnameというローカル変数に代入していますが、self.nameには影響を与えません。セッターメソッドでは、明示的にselfを使ってオブジェクトの属性を更新する必要があります。
正しくは、以下のようにself.nameを使う必要があります。
class Person
attr_accessor :name
def set_name(name)
self.name = name
end
endこれによって、set_nameメソッドがname属性を正しく更新することができます。
まとめ
Rubyのself変数は、オブジェクト自体を参照するための特別なキーワードです。メソッド内では、通常は省略できますが、セッターメソッドなど、オブジェクトの属性を更新する場合にはselfを使う必要があります。これを理解していれば、Rubyのオブジェクト指向プログラミングの理解が進むでしょう。



コメント