Они не одинаковы. Рассмотрим следующий код Ruby:
class Person
attr_accessor :employer
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
Метод attr_accessor
удобно генерирует для вас средство чтения и записи атрибутов (employer=
и employer
). Вы можете использовать эти методы для чтения и записи атрибута, который хранится в переменной экземпляра @employer
.
Теперь мы можем переписать вышеприведенное к следующему, что функционально идентично приведенному выше коду:
class Person
def employer=(new_employer)
@works_for = new_employer
end
def employer
@works_for
end
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
Теперь переменная экземпляра @employer
больше не используется. Мы решили написать методы доступа вручную, и у нас есть свобода выбора другого имени для переменной экземпляра. В этом конкретном примере имя переменной экземпляра отличается от имени атрибутов доступа. Ничто не мешает вам сделать это.
Это похоже на то, как ActiveRecord
хранит свои атрибуты внутри. Они не хранятся в переменных экземпляра с одинаковыми именами, поэтому ваш push
вызов @object_collection
не работает.
Как вы понимаете, читатели и писатели атрибутов предлагают определенную абстракцию, которая может скрыть от вас детали реализации. Поэтому чтение и запись переменных экземпляра непосредственно в подклассы обычно считается плохой практикой.