Rubyのselfが微妙に意味がわからなかったので、様々な文脈(トップレベル、class定義内、method定義内、module定義内)で出力してみた
Rubyのselfが微妙にわからん
Rubyのselfが使う割にきちんと理解できていない気がしたので、
いろんな文脈で出力してみた。
トップレベルの文脈でのself
コード
p self
結果
main
トップレベルではmainというオブジェクトがmethodを実行しているらしい。
へぇ。知らなかった。
class定義内、mthod定義内でのself
コード
class Hoge # class定義内 p self def self.hello # class method定義内 p self end def hello # インスタンスmethod定義内 p self end end
なにが出力されるのか、結果を見る前に考えてみよう。
結果
class Hoge # class定義内 p self #=> Hoge def self.hello # class method定義内 p self #=> Hoge end def hello # インスタンスmethod定義内 p self #=> #<Hoge:0x007fc586a99db0> end end
これの結果を見ると、
class定義内、class method定義内のself => classを返す
method定義内のself => methodを呼び出した時のインスタンスを返す
ということがわかる。
module定義内でのself
コード
module Hoge def hello p self end module_function :hello end Hoge.hello
結果
Hoge
module名を返す。なるほど。
moduleをincludeしてトップレベルで呼び出した時のself
コード
module Hoge def hello p self end end include Hoge hello
結果
main
トップレベルでのコンテクストになるからmainが返るのか。
へぇ。
moduleをincludeしたクラスから呼び出した時のself
コード
module Hoge def hello p self end end class Fuga include Hoge def call_mod_method hello end end fuga = Fuga.new fuga.call_mod_method
結果
#<Fuga:0x007f25e53ade20>
これは実質selfをmethod定義内で呼び出しているので、
インスタンスが返ってくるのは納得。