Ruby es uno de los idiomas más populares utilizados en la web. Hace poco, comenzamos una nueva serie de screencast aquí en Nettuts + que te presentará a Ruby, así como a los grandes marcos y herramientas que acompañan el desarrollo de Ruby. En este capítulo, veremos cómo crear nuestras propias clases de Ruby..
En el capítulo dos, aprendimos cómo agregar métodos a un objeto ya existente. Si queremos comenzar con un objeto en blanco que luego podemos aumentar con métodos y propiedades, podemos crear una instancia de Objeto
clase.
o = Object.new def o.my_method 1 + 1 end o.my_method # => 2
¿Qué pasa con las propiedades? Bueno, Ruby tiene variables de instancia (variables que obtiene cada instancia de un objeto); una variable de instancia comienza con un signo 'a' (@
). Puede obtener y establecer estas variables de instancia creando funciones especialmente para ese propósito.
def o.set_name (nombre) @name = name end def o.get_name @name end o.set_name "Andrew" o.get_name # => Andrew
Debe tener en cuenta que la variable @nombre
no necesita ser inicializado en ninguna parte. Ruby se encarga de mantener eso organizado para ti. Ahora podemos configurar y obtener las variables de instancia. @nombre
. Sin embargo, ¿no es bastante feo de usar? escoger un nombre
y get_name
para propiedades? Haciendo algo como o.name = "Andrew"
escribir y o.name
Leer sería mucho más natural. Veremos cómo hacer esto en un minuto; Pero por ahora, vamos a empezar a crear una clase propia..
Es bastante simple crear una clase. Solo usa la siguiente sintaxis. En esta lección, estaremos creando una muy inútil. Persona
clase:
clase persona fin
De nuevo, super-simple. Vamos a empezar a rellenarlo.
Hemos visto cómo crear propiedades: solo son envoltorios de métodos para variables de instancia. Sin embargo, queremos que actúen más como la forma en que se espera que actúen las propiedades. Es fácil para el método get:
def nombre @nombre final
Ya que estamos dentro de la clase, no tenemos que dar el nombre de un objeto en la firma del método; solo el nombre del método servirá. Cuando creamos una instancia de la Persona
clase de decir, p1
-Podremos llamar a esto de la manera habitual.-p1.nombre
.
Pero, ¿cómo podemos mejorar la apariencia de establecer la @nombre
variable?
Ruby nos da una increíble cantidad de azúcar para hacer esto realmente genial. Mira esto:
def nombre = nombre @nombre = nombre fin
Está bien, ¿y qué? De esta manera, estamos escribiendo. p1.name = ("joe")
o al menos p1.name = "joe"
, porque los paréntesis no son necesarios. ¿Es eso mucho mejor? Bueno, aquí está la parte interesante: puedes poner espacios y Ruby no se saltará nada:
p1.name = "joe"
Ahora, podemos escribir y leer nuestras variables de instancia de la forma en que se espera que se lean las propiedades.
Pero se pone aún mejor. Establecer propiedades a través de métodos como este le da la oportunidad de hacer algo con el valor que el usuario de su clase transfiere, algo más que asignarlo a una variable de instancia, si es apropiado para su clase. Sin embargo, hay una buena probabilidad de que la mayoría de las veces haga lo mismo que nosotros aquí: simplemente configure u obtenga las variables de instancia. En ese caso, Ruby lo hace aún más fácil. Solo agrega esto en la parte superior de tu clase:
attr_accessor: name,: age,: your_properties_here
Pasar attr_accessor
Los nombres de tus propiedades como símbolos. Esto crea el var
y var =
Métodos para ti. Entonces, podrás usar el @
Versiones donde sea que necesites en tu código..
Si desea propiedades de solo lectura o solo escritura, puede utilizar attr_reader
o attr_writer
, respectivamente. Por supuesto, si usas, di, attr_writer
, A continuación, puede crear un método de lector personalizado si es necesario.
Hemos visto cómo crear métodos de instancia; no olvide que puede usar esos valores de propiedad si necesita:
def greet "# @ name dice: '¡Hola!'" fin
A menudo, querrá realizar algún código de configuración cuando se crea una instancia de una clase. Esto se hace en una función constructora. En Ruby, la función constructora se llama inicializar
. Pop esto cerca de la parte superior de nuestra Persona
clase:
def initialize (nombre, edad, trabajo = 'desempleado') @name = nombre @age = age @job = fin de trabajo
Como puede ver, la inicialización toma tres parámetros. El tercero, trabajo
, es opcional, porque le hemos dado un valor predeterminado. Por supuesto, esto funciona para cualquier función, no solo una función de constructor. Ahora, cuando queremos crear una instancia de persona, tenemos que hacer lo siguiente:
joe = Person.new ("Joe", 35, "fontanero") jill = Person.new "Jill", 14
Los métodos privados son funciones que solo pueden ser llamadas por otras funciones dentro de la clase; no están expuestos al mundo exterior. La forma habitual de crear métodos privados es la siguiente: debajo de todo su código público (los métodos de instancia y clase), agregue la palabra clave privado
. Cualquier función que siga a esta palabra clave es privada..
# Instancia y métodos de clase por encima de la definición privada get_real_weight @weight end end # de la clase
Si intenta llamar a este método en una instancia de Persona
, no funcionará.
Los métodos y las propiedades de la clase son funciones y variables que no son accesibles desde instancias de una clase, sino desde la propia clase. Por ejemplo, vamos a crear un método de clase que devuelve el número de Persona
instancias que hemos creado.
Primero, tenemos que crear una variable de clase que contendrá el número de Persona
instancias que hemos creado. Las variables de clase están prefijadas con dos signos at. Entonces, agregue esto a su clase, preferiblemente bajo las líneas attr_ *:
@@ count = 0
Ahora, cada vez que hacemos una nueva. Persona
, Queremos incrementar esta variable. ¿Qué se ejecuta cada vez que hacemos un Persona
? inicializar
, por supuesto; así que actualízalo en consecuencia. Ahora se ve así:
def initialize (nombre, edad, trabajo = 'desempleado') @name = nombre @age = age @job = trabajo @@ count + = 1 final
Entonces, por supuesto, tenemos que crear el método de clase:
def self.count @@ count end
Ahora, intente esto:
joe = Person.new ("Joe", 35, "fontanero") jill = Person.new ("Jill", 13) bob = Person.new "Bob", 70 Person.count # => 3
Nota - Ruby realmente no tiene métodos de clase (o métodos estáticos, como algunos idiomas los llaman). De hecho, hay un poco de "magia" bastante interesante bajo la superficie que hace que estos se vean como métodos de clase. Entraremos en eso, generalmente llamado metaprogramación, en un capítulo futuro..
Es todo por hoy; Si tiene alguna pregunta, hágamelo saber en los comentarios. La próxima vez, exploraremos muchos métodos comunes en las clases incorporadas de Ruby.
PD - He estado jugando con la configuración de sonido en mi micrófono. ¿Es el volumen en este examen lo suficientemente alto, o debería ser más alto??