2012-11-14 32 views
6

我對Ruby的理解是,'new'關鍵字總是和一個類名相結合以創建一個類的新實例。在下面的代碼中找到了https://gist.github.com/e9c0da1a6e92dd12cbc7,這是作爲Newbies大賽的Ruby編程挑戰解決方案提交的,作者使用「new」關鍵字三次而不實例化一個類。Ruby:沒有類的'new'

在一種情況下,new(0,0)被分配給常量CLOSED。在另一種情況下,new(open,close)是函數的返回值。爲什麼這樣做?使用這種方式時,「新」是什麼?它是什麼創造的?

class OpenHours 

    attr_reader :open, :close 

    def initialize(open, close) 
     @open, @close = open, close 
    end 

    def duration 
     @duration ||= @open < @close ? @close - @open : 0 
    end 

    CLOSED = new(0, 0)    #first new 


    def self.parse(open, close) 
     open = Time.parse(open) 
     close = Time.parse(close) 


     open = TimeUtils::seconds_from_midnight(open) 
     close = TimeUtils::seconds_from_midnight(close) 


     new(open, close)      #second new 

    end 

    def offset(seconds) 
     self.class.new([@open, seconds].max, @close)  #third new 
    end 

    end 

回答

5

當接收方是self,可以省略接收器。您詢問的前兩個new呼叫在OpenHours的上下文中調用,這意味着self設置爲OpenHours。因此,沒有顯式接收器的new相當於self.newOpenHours.new。在第三個示例中,上下文是OpenHours的實例。 self是指那個例子,self.class是指OpenHours,所以self.class.new等於OpenHours.new。在所有情況下,創建的對象都是OpenHours的實例。

6

在Ruby,new操作者或關鍵字。它是Class實例的實例方法。例如,對象OpenHours是一個類,因此是Class的一個實例,因此具有實例方法new

0

OpenHours :: CLOSED是OpenHours

irb(main):034:0> OpenHours::CLOSED 
=> #<OpenHours:0x3ee2e85d @open=0, @close=0> 
irb(main):035:0> OpenHours::CLOSED.class 
=> OpenHours 

的一個實例,說實話,我不知道他們在這裏做什麼。我認爲這是糟糕的代碼。

回覆評論:如果你這樣做foo = OpenHours.parse(open, close),那麼實例將被分配到foo

+0

那麼self.parse方法返回OpenHours的新實例(打開,關閉)?它不應該分配給某些東西嗎? – BrainLikeADullPencil