2015-10-15 51 views
-1

我试图定义和调用函数new命令的方法`内忽略new`

module Me 
    class Bobkat 
    def new() 
     puts "Kernel.caller()[0].to_s() is " << Kernel.caller()[0].to_s() 
     initialize() 
    end 
    def initialize 
     return self 
    end 
    end 
end 

Me::Bobkat.new() 

它忽略了puts命令。我想知道为什么它这样做。有任何想法吗?

+2

顺便说一句,在[默认实现(http://ruby-doc.org/core-2.2.3/Class.html #method-i-new)调用'allocate'创建一个新对象,调用对象的'initialize'方法(传递任何参数)并返回该对象。 – Stefan

回答

0

如果您仍然希望重写新的方法,在这里你是:

module Me 
    class Bobkat 
    class << self 
     def new(*args) 
      puts "Kernel.caller()[0].to_s() is " << Kernel.caller()[0].to_s() 
      super 
     end 
    end 
    end 
end 

Me::Bobkat.new 
+2

为什么这么疯狂复杂?只是调用'super'而不是所有'alias_method'跳舞都有什么问题? –

+0

疯狂复杂只是与替代品相比...它是如何做到的与替代品?你知道更简单的编码,使用其他语言吗?我希望不要在这里开始一场神圣的战争...... – user1134991

+1

@ user1134991我想Jörg并不是要开始一场“圣战”(无论它可能在这种情况下),而是指出你的代码比它更复杂是。 –

6

如果您的意思是“它忽略了puts命令”,里面的Me::Bobkat#new没有执行,这是因为您从未称为Me::Bobkat#new。如果你认为你通过做Me::Bobkat.new来调用它,那是错误的。 Me::Bobkat#new(实例方法)和Me::Bobkat.new(类方法)是不同的。

+0

O.K.如何定义类方法?也就是说,我没有明确地定义它,它被称为... 谢谢。 – user1134991

+1

默认情况下定义了'new'类方法。它总是在那里(除非你没有定义它)。如果你想覆盖它,然后'def self.new'。 – sawa

+0

@ user1134991:这并不罕见。 Ruby的核心库中有很多方法为您提供,而不必自己编写。例如,'String#gsub','Fixnum#+','Array#<<','Hash#[]','Kernel#puts','Kernel#require','Module#attr_accessor'等等。你在你的代码中使用了不少于5种不同的方法,你没有明确地定义......为什么'new'会是特殊的? '类#新'是一种像其他任何方法。 –