Обʼєкти можуть зберігати власний стан, задаючи змінні екземпляра. Ці змінні живуть усередині обʼєкта і зазвичай використовуються для зберігання якогось внутрішнього стану.
Змінні екземпляра завжди починаються з @.
Ми можемо створити нову змінну екземпляра, присвоївши змінну, що починається з @.
Наприклад:
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!"
Зазвичай обʼєкти задають свій початковий стан у методі initialize, який автоматично викликається, коли ми викликаємо new на класі.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
Метод initialize також може приймати аргументи, щоб кожен екземпляр міг починати з власним станом:
class Suitcase
def initialize(locked)
@locked = locked
end
end
Гарна практика - вважати змінні екземпляра приватними, закритими для зовнішнього читання й запису. Замість цього ми визначаємо методи, щоб отримувати й задавати їхні значення. Наприклад:
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 - англійське слово, яке означає «ніщо» або «нуль».
У Ruby nil використовують, щоб виразити відсутність обʼєкта.
В інших мовах програмування подібну роль можуть відігравати значення null або none.
# I do not have a favorite color
favorite_color = nil
Будь-яка змінна екземпляра отримує типове значення nil, доки їй не нададуть іншого значення.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Ми працюємо з парком розваг, і нам передали специфікацію, за якою треба спроєктувати систему для обліку відвідувачів і атракціонів. Нам доручили змоделювати Attendee (людину, яка відвідує парк).
Реалізуйте метод Attendee#initialize класу Attendee. Він має приймати зріст (у сантиметрах) і зберігати його як змінну екземпляра.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Реалізуйте гетер Attendee#height класу Attendee. Він має повертати зріст екземпляра.
Attendee.new(106).height
# => 106
Не всі відвідувачі купили перепустку на атракціон, але нам треба знати, чи мають вони перепустку. Реалізуйте гетер Attendee#pass_id класу Attendee. Він має повертати pass_id екземпляра або nil, якщо у відвідувача немає перепустки.
Attendee.new(106).pass_id
# => nil
Реалізуйте Attendee#issue_pass!, щоб змінити стан екземпляра й записати значення аргументу в змінну екземпляра для ідентифікатора перепустки. Він має повертати ідентифікатор перепустки.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Деякі гості порушують правила небезпечною поведінкою, тож парк хоче мати змогу скасовувати перепустки. Реалізуйте Attendee#revoke_pass!, щоб змінити стан екземпляра і встановити ідентифікатор перепустки в nil.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.