selfがよくわからんので学んだことのメモを。
※本記事は更新中で変更の可能性があります
※2020/5/14時点
※※ここではメソッド定義の中におけるselfの話をさします
※※クラスメソッドのselfなどは無視します
selfはメソッドの中で使えるオブジェクト。
selfはそのメソッドをうけとっているインスタンス自身を指す。
例
class User
attr_accessor :name
# setter: name=(value)
# getter: name
def initialize(name)
@name=name
end
def sayhi
# self
puts "hi.#{@name}"
end
end
user=User.new("bob")
user.sayhi # userがselfにあたり、レシーバーと呼ぶこともある
上記でコメントにしているselfはUser.newによって生成されたオブジェクトbobを指す。
続いてselfを実際につかう場合、、
class User
attr_accessor :name
# setter: name=(value)
# getter: name
def initialize(name)
@name=name
end
def sayhi
# self
puts "hi.#{@name}"
# 追記箇所
puts "hi.#{self.name}"
end
end
user=User.new("bob")
user.sayhi # userがselfにあたり、レシーバーと呼ぶこともある
コンソールで吐き出すと
ec2-user:~/environment/ruby_lessons $ ruby hello.rb
hi.bob
hi.bob
と、なる。
selfが使えるのは
「getterが設定されてるからself.nameにすると、結果としてインスタンス変数が取得できて@nameがかえってくる」
ということらしい。
なのでためしにattr_accessorをコメントアウトしてみると
class User
# attr_accessor :name コメントアウトに
# setter: name=(value)
# getter: name
def initialize(name)
@name=name
end
def sayhi
# self
# self.name -> @name(getterが設定されてるから)
puts "hi.#{@name}"
puts "hi.#{self.name}"
# puts "hi.#{name}" # ややこしくならない場合は省略できる
end
end
user=User.new("bob")
user.sayhi
コンソールで吐き出すと
ec2-user:~/environment/ruby_lessons $ ruby hello.rb
hi.bob
Traceback (most recent call last):
1: from hello.rb:118:in `<main>'
hello.rb:111:in `sayhi': undefined method `name' for #<User:0x000000000256fef8 @name="bob"> (NoMethodError)
ec2-user:~/environment/ruby_lessons $
と、なselfのほうがエラーとなる。
要するに、selfはattr_accessor(厳密にはgetter)とセットってことですかね。
同じ事例で分かりやすい説明を発見しました。