LoginSignup
1
0

More than 3 years have passed since last update.

メソッド定義の中におけるselfについて

Last updated at Posted at 2020-05-14

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)とセットってことですかね。

同じ事例で分かりやすい説明を発見しました。

こちらです

1
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
1
0