対象者
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をつけるとインスタンス変数の値の更新が行われる