Работа с полями класса в Ruby.
ООП в этом вашем Ruby сильно отличается от ООП в этом нашем пролетарском php =). К примеру, возьмем такую тривиальную вещь как поля класса. Несмотря на то, что методы инкапсулируются, поля - нет. (Другими словами, для полей нельзя применить модификатор доступа). Все поля protected. То есть, с одной стороны, нас насильно заставляют кодить "по понятиям": геттеры, сеттеры и прочие непристойные вещи, со второй нужно написать пачку неинформативного кода (геттеры/сеттеры (getters/setters) ). К счастью, в Ruby есть средства для автоматизации этого: ключевые слова attr_accessor, attr_reader, attr_writter. Первое слово - сразу геттер и сеттер, следующие два, как понятно с названия - геттер и сеттер соответственно. Пример использования:
class Foo
attr_accessor: :id,
:name,
:emailend
foo = Foo.new
#сеттер
foo.id = 1
#геттер
a = foo.id
Надеюсь, вы помните особенности Ruby и знаете, что последняя строка это как раз вызов метода, а не присвоение полю объекта, как может показаться на первый взгляд.В случае наследования, поля просто слагаются: если сделаем еще класс Goo:
class Goo < Fooend
то следующий код имеет смысл:
goo = Goo.new
#сеттер
goo.id = 1 #геттер
a = goo.id
Естественно, этим удобно пользоваться, если геттер/сеттер не содержит дополнительной логики. В случае же присутствия таковой, ни куда не денемся от прямого объявления геттеров/сеттеров:
class Foo
def id=(val)
#some logic
@id = val
end def id
#some logic
@id
end
end
Обратите внимание, что с переменные класса начинаются с символа @@, переменные экземпляров - с @
Теперь становится понятным, почему, почему foo.id = 1 - это вызов метода, а не присвоение: так как для вызова метода скобки ставить не обязательно, это все равно. что написать foo.id= 1, или foo.id=(1) (но делать так ни в коем случае не нужно!).