ume

attr_accessorの使い方とセッターメソッドの注意点

対象者

  • selfが省略できる時とできない時の違いがわからない方

  • attr_accessorの復習をしたい方

attr_accessorとは

インスタンス変数とセッターメソッド、ゲッターメソッドのこの3つを自動作成してくれる機能(画面上には見えない)。 セッター?ゲッター?となった方は↓を参照してください loveenglish.hatenablog.com

attr_accessorの例文↓

class Onepiece 
attr_accessor :name  
 

end

onepiece = Onepiece.new
onepiece.name = "ゾロ"
puts onepiece.name  出力結果 ゾロ
attr_accessor 好きなインスタンス変数名 

上の1行を追加すると↓の例文と同じ意味です。要はゲッターメソッドとセッターメソッドを自動生成してくれる

class Onepiece 


def name  ゲッターメソッド
  @name
end 

def name=(name) セッターメソッド
  @name = name 
end 

end 

onepiece = Onepiece.new
onepiece.name = "ゾロ" ⇦この書き方でセッターメソッドのよびだし
puts onepiece.name 出力結果 ゾロ

上を見てわかる通りattr_accessorを使うとコードがすっきりする。なぜならセッターメソッド、ゲッターメソッドを書かなくて良いから。

省略できるself

⇨メソッドの中でメソッドを呼び出すとき

class Onepiece 

def dream
  puts "海賊王に俺はなる"
end 

def introduce 
   dream ⇦dreamメソッドを呼び出す。self.dreamと書いても同じ挙動
end 

end 

  onepiece = Onepiece.new
    onepiece.introduce
  出力結果 海賊王に俺はなる

要は本来dreamメソッドはインスタンスメソッドなのでdreamメソッドを呼び出す際

 onepiece.dream

みたいにdreamメソッドの前にはインスタンスが必要。ただメソッドの中で他のメソッドを使用する際selfと記載することでselfがonepice(インスタンス)の代わりになる。 つまりself.dream とonepiece.dream は同じ意味になる。この時selfは省略可能なのでintroduceメソッドの中でdreamと記載するだけで呼べる。 ただセッターメソッド内で他のメソッドを呼ぶときselfの扱いには気をつけないといけない

省略できないself

⇨セッターメソッドの中ではselfを省略する時としない時で意味が変わる。

class Onepiece 
  # attr_accessor :name

  def name  #①
    @name
  end 
  
  def name=(value) #②
    @name = value
  end 

  def change_name(name)
   self.name = name  #ここのself.name = nameは②のnameメソッドを呼び出している
  end 
  
  end 
  
  onepiece = Onepiece.new
  onepiece.change_name("サンジ")
  puts onepiece.name #⇦このnameは①のnameゲッターメソッドを読んでいる
selfありの出力結果 サンジ
selfなしの出力結果 nil 
  def change_name(name)
   name = name
  end 
nameというローカル変数にnameを代入する
  def change_name(name)
   self.name = name
  end 

②のセッターメソッドが呼ばれインスタンス変数(@name)にvalueが代入される

まとめ

  • 基本的にメソッドの中で他のメソッドを使うときはselfを省略できる。

  • セッターメソッド内でselfを省略するとローカル変数に代入、selfをつけるとインスタンス変数の値の更新が行われる