Работа с полями класса в Ruby.

ООП в этом вашем Ruby сильно отличается от ООП в этом нашем пролетарском php =). К примеру, возьмем такую тривиальную вещь как поля класса. Несмотря на то, что методы инкапсулируются, поля - нет. (Другими словами, для полей нельзя применить модификатор доступа). Все поля protected. То есть, с одной стороны, нас насильно заставляют кодить "по понятиям": геттеры, сеттеры и прочие непристойные вещи, со второй нужно написать пачку неинформативного кода (геттеры/сеттеры (getters/setters) ). К счастью, в Ruby есть средства для автоматизации этого: ключевые слова attr_accessor, attr_reader, attr_writter. Первое слово - сразу геттер и сеттер, следующие два, как понятно с названия - геттер и сеттер соответственно. Пример использования:

class Foo
  attr_accessor: :id,
                 :name,
                 :email

end

foo = Foo.new #сеттер foo.id = 1

#геттер a = foo.id

Надеюсь, вы помните особенности Ruby и знаете, что последняя строка это как раз вызов метода, а не присвоение полю объекта, как может показаться на первый взгляд.

В случае наследования, поля просто слагаются: если сделаем еще класс Goo:

class Goo < Foo

end

то следующий код имеет смысл:
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) (но делать так ни в коем случае не нужно!).