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のオブジェクト指向プログラミングの理解が進むでしょう。
コメント