2010-10-27 13 views
6

Heute habe ich über die seltsame Rubin Syntax in der Rational Klasse kam:Ruby-Syntax Frage: Rational (a, b) und Rational.new (a, b)

Rational(a,b) 

(Beachten Sie die Abwesenheit des .new() Portion im Vergleich zur normalen Ruby-Syntax). Was bedeutet das genau im Vergleich zur normalen new Syntax? Noch wichtiger: Wie implementiere ich so etwas in meinem eigenen Code und warum sollte ich so etwas implementieren? Speziell für die Rational Klasse, warum wird diese Syntax anstelle der normalen Instanziierung verwendet? Und warum ist die new Methode privat in der rationalen Klasse? (Und wie/warum sollte ich das in meinem eigenen Ruby-Code machen?) Vielen Dank im Voraus für Ihre Antworten, zumal ich so viele Fragen gestellt habe.

Antwort

6

Alles, was Sie tun müssen, ist eine globale Funktion mit dem gleichen Namen wie Ihre Klasse zu deklarieren. Und das ist, was rational.rb tut:

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

den Konstruktor privat zu machen:

private :initialize 

und in ähnlicher Weise für die new Methode:

private_class_method :new 

ich Rational.new nehme öffentlich werden könnte gehalten und gemacht zu tun, was Rational() tut, aber mit einer Methode, die seine Argumente in Instanzen dreht, ist konsistent mit Array(), String() usw. Es ist ein vertrautes Muster, das einfach zu implementieren und zu verstehen ist.

3

Die Methode Rational() ist eine Instanzmethode, die außerhalb der Klasse Rational definiert ist. Es wird daher zu einer Instanzmethode für jedes Objekt, das die Bibliothek 'rational' (normalerweise main: Object) auf die gleiche Weise lädt wie 'puts'.

Per Konvention ist diese Methode normalerweise ein Konstruktor für die Klasse mit dem gleichen Namen.

+0

Dies ist eine sehr wichtige Ergänzung zu @Wayne Conrads Antwort. Danke für die Eingabe. –

+0

In der Tat ist es. Ich habe "Funktion" in "globale Funktion" geändert, in der Hoffnung, dass dies meine Antwort klarer macht. –

Verwandte Themen