2012-11-14 19 views
6

La mia comprensione di Ruby era che la "nuova" parola chiave era sempre combinata con un nome di classe per creare una nuova istanza di una classe. Nel codice qui sotto, trovato a https://gist.github.com/e9c0da1a6e92dd12cbc7, che è stato presentato come soluzione a un concorso di Sfida di programmazione di Ruby per Newbies, l'autore usa la parola chiave 'nuova' tre volte senza creare un'istanza di una classe.Ruby: "nuovo" senza classe

In un caso, nuovo (0,0) è assegnato a una costante CHIUSA. In un altro caso, nuovo (aperto, chiuso) è un valore di ritorno da una funzione. Perché farlo in questo modo? Cosa fa 'new' quando viene usato in questo modo? cosa sta creando?

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 

risposta

5

Quando il ricevitore è self, il ricevitore può essere omesso. Le prime due chiamate new che si stanno interrogando vengono chiamate nel contesto di OpenHours, il che significa che self è impostato su OpenHours. Pertanto, new senza il destinatario esplicito è equivalente a self.new e OpenHours.new. Nel terzo esempio, il contesto è un'istanza di OpenHours. self fa riferimento a tale istanza e self.class fa riferimento a OpenHours, quindi self.class.new equivale a OpenHours.new. In tutti i casi, l'oggetto creato è un'istanza di OpenHours.

6

In Ruby, new è non un operatore o una parola chiave. È un metodo di istanza delle istanze Class. Ad esempio, l'oggetto OpenHours è una classe e pertanto è un'istanza di Class e pertanto ha un metodo di istanza new.

0

OpenHours :: chiuso è un esempio di OpenHours

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

Per essere onesti, non so cosa stanno facendo qui. Penso che sia un codice cattivo.

Rispondi al commento: Se lo fai foo = OpenHours.parse(open, close), quindi l'istanza verrà assegnato al foo

+0

quindi il metodo self.parse restituisce un'istanza nuova (aperta, chiusa) di OpenHours? Non dovrebbe essere assegnato a qualcosa? – BrainLikeADullPencil

Problemi correlati