2012-03-28 10 views
3

selfがRubyのデフォルトの受信者で、インスタンスメソッド定義で 'puts'を呼び出す場合、その呼び出しの受信者のオブジェクトのインスタンスですか?Ruby selfとputs

など。

class MyClass 
     attr_accessor :first_name, :last_name, :size 

     # initialize, etc (name = String, size = int) 

     def full_name 
     fn = first_name + " " + last_name 
     # so here, it is implicitly self.first_name, self.last_name 
     puts fn 
     # what happens here? puts is in the class IO, but myClass 
     # is not in its hierarchy (or is it?) 
     fn 
     end 
    end 

答えて

6

絶対に、現在のオブジェクトはここでメソッド呼び出しの受信者です。その理由は、Kernelモジュールがputsメソッドを定義し、すべてのRubyクラスの暗黙のルートクラスであるObjectに混在しているためです。証明:

class MyClass 
    def foo 
    puts "test" 
    end 
end 

module Kernel 
    # hook `puts` method to trace the receiver 
    alias_method :old_puts, :puts 
    def puts(*args) 
    p "puts called on %s" % self.inspect 
    old_puts(*args) 
    end 
end 

MyClass.new.foo 

これはputs called from #<MyClass:0x00000002399d40>を出力し、そうMyClassインスタンスは受信機です。

1

MyClassは、Kernelで混在するObjectから静かに継承します。

カーネルとしてプットを定義しています

したがって
$stdout.puts(obj, ...) 

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-puts

、あなたはプットを呼び出し、それが自分に移動し、カーネルまでのカスケード。

+0

非常に良い点。ここでのプロトコルは何ですか、私は自分の答えを削除し、あなたのものを残すべきですか(もっと正確です)? –

+0

実際、私は間違っていました。 'self.puts'は現在のクラスで' puts'メソッドを呼び出すのとは異なります。基本的にあなたと同じことを言っていた私の答えの最初の改訂は正しかったし、あなたも同じです。 –

関連する問題