2012-03-28 52 views
3

如果self是ruby中的默认接收方,并且您在实例方法定义中调用'puts',则该对象的实例是该调用的接收方?红宝石自己放

E.g.

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方法,并混合到Object中,这是每个Ruby类的隐式根类。证明:

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默默继承Object,它在Kernel中混合使用。

内核看跌期权的定义是:

$stdout.puts(obj, ...) 

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

因此,你叫看跌期权,它移动到自我,瀑布高达内核。

+0

非常好的一点。这里有什么协议,我应该删除我的答案并留下你的答案(因为它更准确)? – 2012-03-28 16:17:17

+0

其实我错了。 'self.puts'不同于在当前类中调用'puts'方法。因此,我的答案的第一个修订版本基本上与您的说法相同,是对的,您的答案也是如此。 – 2012-03-28 18:05:38