君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

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定義内で呼び出しているので、

インスタンスが返ってくるのは納得。