2010-10-27 25 views
6

Hoy me encontré con la sintaxis de rubí extraña en la clase Rational:Rubí pregunta sintaxis: racional (a, b) y Rational.new (a, b)

Rational(a,b) 

(Nótese la ausencia de la .new() porción en comparación con la sintaxis normal de Ruby). ¿Qué significa esto, precisamente, en comparación con la sintaxis normal new? Más importante aún, ¿cómo implemento algo como esto en mi propio código y por qué implementaría algo como esto? Específicamente para la clase Rational, ¿por qué se utiliza esta sintaxis en lugar de la instanciación normal? ¿Y por qué el método new es privado en la clase racional? (¿Y cómo/por qué iba a hacer esto en mi propio código de rubí?) Gracias de antemano por sus respuestas, especialmente porque he hecho tantas preguntas.

Respuesta

6

Todo lo que tiene que hacer es declarar una función global con el mismo nombre que su clase. Y eso es lo que hace rational.rb:

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

para hacer que el constructor privado:

private :initialize 

y lo mismo para el método new:

private_class_method :new 

supongo Rational.new podría mantenerse pública y hecho para hacer lo que Rational() hace, pero tener un método que convierte sus argumentos en instancias es consistente con Array(), String(), etc. Es un patrón familiar que es fácil de implementar y comprender.

3

El método Rational() es en realidad un método de instancia definido fuera de de la clase Rational. Por lo tanto, se convierte en un método de instancia de cualquier objeto que cargue la biblioteca 'racional' (normalmente main: Object) de la misma manera que 'puts', por ejemplo.

Por convención, este método es normalmente un constructor para la clase del mismo nombre.

+0

esto es una adición muy importante a la respuesta de @Wayne Conrad. Gracias por el aporte. –

+0

De hecho lo es. Cambié "función" a "función global", con la esperanza de que mi respuesta sea más clara. –

Cuestiones relacionadas