Rubyのself変数について分かりやすく解説!インスタンスとの関係も理解しよう

スポンサーリンク

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というように、persongreetメソッドのレシーバーです。

しかし、レシーバーを省略してメソッドを呼び出すと、Rubyは暗黙的にselfをレシーバーとして扱います。つまり、person.greetselfpersonであるかのように振る舞います。

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

コメント

タイトルとURLをコピーしました