2015-10-15 50 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'會是特殊的? '類#新'是一種像其他任何方法。 –