Gli oggetti possono mantenere il proprio stato impostando delle variabili di istanza. Queste variabili vivono all'interno di un oggetto e normalmente servono a memorizzare uno stato interno.
Le variabili di istanza iniziano sempre con una @.
Puoi creare una nuova variabile di istanza assegnando una variabile che inizia con una @.
Per esempio:
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!"
Di solito gli oggetti impostano il proprio stato iniziale in un metodo initialize, che viene chiamato automaticamente quando si chiama new su una classe.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
Il metodo initialize può anche accettare argomenti, così che ogni istanza possa partire con uno stato personalizzato:
class Suitcase
def initialize(locked)
@locked = locked
end
end
È buona pratica considerare le variabili di istanza come private rispetto a letture e scritture esterne. Al loro posto, definiamo dei metodi per leggerne e impostarne i valori. Per esempio:
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 è una parola inglese che significa «niente» o «zero».
In Ruby, nil viene usato per esprimere l'assenza di un oggetto.
In altri linguaggi di programmazione, valori come null o none possono svolgere un ruolo simile.
# I do not have a favorite color
favorite_color = nil
Ruby assegna a qualsiasi variabile di istanza il valore predefinito nil quando viene incontrata per la prima volta, finché non le viene assegnato un valore diverso.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Lavorando con un parco divertimenti, ti è stata consegnata una specifica per progettare un sistema che gestisca le presenze e le giostre. Il tuo compito è modellare l'Attendee (la persona che visita il parco).
Implementa il metodo Attendee#initialize della classe Attendee: deve accettare un'altezza (in centimetri) e memorizzarla in una variabile di istanza
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Implementa il getter Attendee#height della classe Attendee: deve restituire l'altezza dell'istanza
Attendee.new(106).height
# => 106
Non tutti gli Attendee hanno acquistato un pass per le giostre, ma dobbiamo sapere se ne hanno uno o no. Implementa il getter Attendee#pass_id della classe Attendee: deve restituire il pass_id dell'istanza, oppure nil se l'Attendee non ne ha uno.
Attendee.new(106).pass_id
# => nil
Implementa Attendee#issue_pass! per mutare lo stato dell'istanza ed impostare la variabile di istanza del pass id all'argomento. Deve restituire il pass id.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Alcuni ospiti infrangono le regole con comportamenti pericolosi, quindi il parco vuole poter revocare i pass. Implementa Attendee#revoke_pass! per mutare lo stato dell'istanza ed impostare il pass id su nil
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.