суббота, 4 августа 2007 г.

Ruby : Объекты , атрибуты и прочее

Продолжаем тему ООП в Руби :).



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."

Переменные класса доступны для всех объектов вашего класса, объявлять их нужно до того как вы начнёте их использовать. Переменная класса начинается с двойной "@" в отличии от локальной переменной.Так же переменные класса доступны только для класса и его инстанций и если вы хотите использовать его извне то нужно прописать для них доступ, как это делать описано в начале заметки.

Комментариев нет: