LoginSignup
3
2

More than 5 years have passed since last update.

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

Posted at

あまり影の濃くない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を割り当ててくれるので、あまりこの辺りを考えずとも実装可能ですが、
きちんと裏で何が動いているのかを理解することは大切だと思うので書いてみました。

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

3
2
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
3
2