Продолжаем тему ООП в Руби :).
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end
У нас есть атрбитуты name , artist , duarion но использовать вне объекта или через другие объекты мы их не можешь, а конкретно прочитать либо изменить, что собственно приводит к бесполезности объекта в какой-то степени. Для того, чтобы сделать атрибут читаемым и редактируемым нам следует сделать так:
class Song
attr_reader :name :artist :duration; # Разрешает чтение атрибута
attr_write :name :artist :duration; # Разрешает запись атрибута
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end
В доках по руби был приведен очень интересный пример использования переменные класса, к примеру у нас есть класс Song в котором есть метод инициализации и метод play который выводи сколько раз играла музыка и сколько раз играла конкретно взятая песня. Т.е мы создаём объекты класса Song, каждый объект это песня. Теперь вопрос:
Как сделать учёт того, сколько раз играла песня данного объекта и сколько раз всего играла музыка. Если говорить с точки зрения программирования на эту задачу, то вопрос стоит таким образом.
Как вести учёт того, сколько раз вызывался метод конкретного объекта и сколько раз вызывался этот метод вобще в целом. Решение:
class Song
@@plays = 0
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
def play
@plays += 1
@@plays += 1
"This song: #@plays plays. Total #@@plays plays."
end
end
####### дебаг)
s1 = Song.new("Song1", "Artist1", 234) # test songs..
s2 = Song.new("Song2", "Artist2", 345)
s1.play » "This song: 1 plays. Total 1 plays."
s2.play » "This song: 1 plays. Total 2 plays."
s1.play » "This song: 2 plays. Total 3 plays."
s1.play » "This song: 3 plays. Total 4 plays."
Переменные класса доступны для всех объектов вашего класса, объявлять их нужно до того как вы начнёте их использовать. Переменная класса начинается с двойной "@" в отличии от локальной переменной.Так же переменные класса доступны только для класса и его инстанций и если вы хотите использовать его извне то нужно прописать для них доступ, как это делать описано в начале заметки.
Комментариев нет:
Отправить комментарий