Os objetos podem guardar o seu próprio estado através da definição de variáveis de instância. Estas variáveis existem dentro de um objeto e são normalmente usadas para guardar algum estado interno.
As variáveis de instância começam sempre com um @.
Podes criar uma nova variável de instância atribuindo um valor a uma variável que comece com @.
Por exemplo:
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, os objetos definem o seu estado inicial num método initialize, que é chamado automaticamente quando se chama new numa classe.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
O método initialize também pode receber argumentos, para que cada instância possa começar com um estado personalizado:
class Suitcase
def initialize(locked)
@locked = locked
end
end
É boa prática considerar que as variáveis de instância são privadas, não podendo ser lidas nem alteradas do exterior. Em vez disso, definimos métodos para obter e definir os seus valores. Por exemplo:
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 é uma palavra inglesa que significa "nada" ou "zero".
Em Ruby, nil é usado para expressar a ausência de um objeto.
Noutras linguagens de programação, valores como null ou none podem desempenhar um papel semelhante.
# I do not have a favorite color
favorite_color = nil
O Ruby atribui a qualquer variável de instância o valor predefinido nil quando esta é encontrada pela primeira vez, até que lhe seja atribuído outro valor.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Trabalhas num parque de diversões e foi-te entregue uma especificação para conceberes um sistema que faça a gestão da afluência e das atrações. Foi-te pedido que modeles o Attendee (a pessoa que visita o parque).
Implementa o método Attendee#initialize da classe Attendee; este deve receber uma altura (em centímetros) e guardá-la numa variável de instância
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Implementa o getter Attendee#height da classe Attendee; este deve devolver a altura da instância
Attendee.new(106).height
# => 106
Nem todos os visitantes compraram um passe de atrações, mas precisamos de saber se têm passe ou não. Implementa o getter Attendee#pass_id da classe Attendee; este deve devolver o pass_id da instância ou nil se o visitante não tiver um.
Attendee.new(106).pass_id
# => nil
Implementa Attendee#issue_pass! para alterar o estado da instância e definir a variável de instância do id do passe com o argumento. Deve devolver o id do passe.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Alguns visitantes infringem as regras com comportamentos inseguros, por isso o parque quer poder revogar passes. Implementa Attendee#revoke_pass! para alterar o estado da instância e definir o id do passe como nil
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.