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