0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-06-30

対象者

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

  • attr_accessorの復習をしたい方

attr_accessorとは

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

attr_accessorの例文↓


class Onepiece 
 attr_accessor :name  

 def initialize()
    処理
  end 
 
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をつけるとインスタンス変数の値の更新が行われる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?