Help us understand the problem. What is going on with this article?

selfについて(影薄く感じてたけど案外濃い)

More than 1 year has passed since last update.

あまり影の濃くないself

Railsをいじると、あまりselfを使う機会がないので意識することが少ないですが、selfについてまとめます。
rubyを少しやると、ああ〜重要やわ〜と思います。

selfはインスタンス自身のこと

selfはインスタンスそのもののことを指します。

インスタンスってなんやねんという方は、一応自分なりにまとめましたので
ご覧いただければ幸いです。

クラスとインスタンスがなんとなくわかったのでメモ

なので、インスタンスメソッドとかもこのselfになら使えます。

ruby.rb
class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add
myclass.show

#=> 私の名前はttmです。

こんな感じのclassがある時、普通に動くのですが、
メソッドチェインやり始めると下のようなエラーになります。

ruby.rb
class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add.show

#=> undefined method `show' for "私の名前はttmです。":String (NoMethodError)

となります。

原因はaddメソッドの返り値が文字列だから

ruby.rb
class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
puts myclass.add

#=> 私の名前はttmです。

試しにaddメソッド後の返り値を見てみると、『私の名前はttmです』となっています。
これはstringですので、それに対して、インスタンスメソッドであるshowをつけることができないのです。
と困ったところで、selfの出番です。

返り値をインスタンスにしてあげる

ruby.rb
class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
    self
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
puts myclass.add

#=>#<Myclass:0x007fd2d181e948>


addメソッドの中に返り値でselfを追加しました。そうすると、myclass.addの中身はMyclass:0x007fd2d181e948になりました。これはインスタンスです。
インスタンスになら、インスタンスメソッドであるshowは使うことができます。
つまり。。。

ruby.rb
class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
    self
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add.show

#=> 私の名前はttmです。

となります。

Railsでは自動でselfを割り当ててくれるので、あまりこの辺りを考えずとも実装可能ですが、
きちんと裏で何が動いているのかを理解することは大切だと思うので書いてみました。

間違い等指摘がありましたら、お教えください!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした