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