Los objetos pueden guardar su propio estado definiendo variables de instancia. Estas variables viven dentro de un objeto y normalmente se utilizan para almacenar algún estado interno.
Las variables de instancia siempre empiezan por @.
Puedes crear una nueva variable de instancia asignando una variable que empiece por @.
Por ejemplo:
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
Normalmente, los objetos establecen su estado inicial en un método initialize, que se llama automáticamente al llamar a new en una clase.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
El método initialize también puede recibir argumentos, de modo que cada instancia pueda empezar con un estado personalizado:
class Suitcase
def initialize(locked)
@locked = locked
end
end
Es una buena práctica considerar que las variables de instancia son privadas frente a lecturas y escrituras externas. En su lugar, definimos métodos para obtener y establecer sus valores. Por ejemplo:
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil es una palabra inglesa que significa «nothing» o «zero».
En Ruby, nil se utiliza para expresar la ausencia de un objeto.
En otros lenguajes de programación, los valores null o none pueden desempeñar un papel similar.
# I do not have a favorite color
favorite_color = nil
Ruby asigna a cualquier variable de instancia el valor predeterminado nil cuando se encuentra por primera vez, hasta que se le asigne otro valor.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Trabajas en un parque de atracciones y te han entregado la especificación de un sistema para gestionar la asistencia y las atracciones. Tu tarea consiste en modelar el Attendee (la persona que visita el parque).
Implementa el método Attendee#initialize de la clase Attendee; debe recibir una altura (en centímetros) y almacenarla en una variable de instancia.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Implementa el getter Attendee#height de la clase Attendee; debe devolver la altura de la instancia.
Attendee.new(106).height
# => 106
No todos los visitantes han comprado un pase de atracciones, pero necesitamos saber si lo tienen o no. Implementa el getter Attendee#pass_id de la clase Attendee; debe devolver el pass_id de la instancia o nil si el visitante no tiene uno.
Attendee.new(106).pass_id
# => nil
Implementa Attendee#issue_pass! para modificar el estado de la instancia y asignar a la variable de instancia del id del pase el valor del argumento. Debe devolver el id del pase.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Algunos visitantes incumplen las normas con conductas peligrosas, así que el parque quiere poder revocar los pases. Implementa Attendee#revoke_pass! para modificar el estado de la instancia y asignar nil al id del pase.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.