2010-10-27 5 views
6

Aujourd'hui, je suis tombé sur la syntaxe rubis étrange dans la classe Rational:Ruby question syntaxe: rationnelle (a, b) et Rational.new (a, b)

Rational(a,b) 

(Notez l'absence du .new() partie comparée à la syntaxe normale de Ruby). Qu'est-ce que cela signifie exactement par rapport à la syntaxe normale new? Plus important encore, comment puis-je implémenter quelque chose comme ça dans mon propre code, et pourquoi implémenterais-je quelque chose comme ça? Spécifiquement pour la classe Rational, pourquoi cette syntaxe est-elle utilisée à la place de l'instanciation normale? Et pourquoi la méthode new est-elle privée dans la classe rationnelle? (Et comment/pourquoi ferais-je cela dans mon propre code ruby?) Merci d'avance pour vos réponses, d'autant plus que j'ai posé tant de questions.

Répondre

6

Tout ce que vous avez à faire est de déclarer une fonction globale avec le même nom que votre classe. Et c'est-ce rational.rb fait:

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

pour rendre le constructeur privé:

private :initialize 

et de même pour la méthode new:

private_class_method :new 

Je suppose que Rational.new pourrait être gardé publique et fait pour faire ce que fait Rational(), mais ayant une méthode qui transforme ses arguments en instances est compatible avec Array(), String(), etc. C'est un modèle familier qui est facile à implémenter et à comprendre.

3

La méthode Rational() est en fait une méthode d'instance définie en dehors de de la classe Rational. Il devient donc une méthode d'instance de n'importe quel objet qui charge la bibliothèque 'rationnelle' (normalement main: Object) de la même manière que 'puts', par exemple.

Par convention, cette méthode est normalement un constructeur pour la classe du même nom.

+0

Ceci est un ajout très important à la réponse de @Wayne Conrad. Merci pour la contribution. –

+0

En effet, c'est. J'ai changé «fonction» en «fonction globale», espérant que ma réponse soit plus claire. –

Questions connexes