2010-10-27 25 views
6

Oggi mi sono imbattuto la sintassi rubino strano nella classe Rational:Rubino domanda sintassi: razionale (a, b) e Rational.new (a, b)

Rational(a,b) 

(notare l'assenza del .new() porzione rispetto alla normale sintassi di Ruby). Che cosa significa, esattamente, rispetto alla normale sintassi new? Ancora più importante, come posso implementare qualcosa di simile nel mio codice e perché dovrei implementare qualcosa di simile? In particolare per la classe Rational, perché questa sintassi viene utilizzata al posto della normale istanziazione? E perché il metodo new è privato nella classe razionale? (E come/perché dovrei farlo nel mio stesso codice rubino?) Grazie in anticipo per le vostre risposte, soprattutto perché ho fatto tante domande.

risposta

6

Tutto ciò che dovete fare è dichiarare una funzione globale con lo stesso nome della vostra classe. Ed è quello che fa rational.rb:

def Rational(a, b = 1) 
    if a.kind_of?(Rational) && b == 1 
    a 
    else 
    Rational.reduce(a, b) 
    end 
end 

per fare il privato costruttore:

private :initialize 

e allo stesso modo per il metodo new:

private_class_method :new 

suppongo Rational.new potrebbero essere mantenuti pubblico e fatto per fare ciò che fa Rational(), ma avere un metodo che trasforma i suoi argomenti in istanze è coerente con Array(), String(), ecc. È un modello familiare che è facile da implementare e capire.

3

Il metodo Rational() è in realtà un metodo di istanza definito all'esterno della classe della classe Rational. Diventa quindi un metodo di istanza di qualunque oggetto carica la libreria 'razionale' (normalmente principale: Oggetto) nello stesso modo in cui fa 'puts', per esempio.

Per convenzione questo metodo è normalmente un costruttore per la classe con lo stesso nome.

+0

questa è un'aggiunta molto importante alla risposta di @Wayne Conrad. Grazie per l'input. –

+0

In effetti lo è. Ho cambiato "funzione" in "funzione globale", sperando che la mia risposta sia più chiara. –

Problemi correlati