Безпосередній доступ до змінної екземпляра та використання методу доступу


80

Хто-небудь може пояснити різницю між доступом до атрибута екземпляра через self.attributeі за допомогою @attribute?

Відповіді:


100

self.attributeвикликає метод attribute.
self.attribute = valueвикликає метод attribute=з аргументом value.
@attributeі @attribute = valueотримати / встановити значення змінної екземпляра @attribute.

Отже, в основному це дві абсолютно різні речі.

Однак якщо ви зателефонуєте, attr_accessor :attributeце визначає метод attributeдля повернення @attributeта метод attribute=(value)для встановлення @attribute = value. Тож у такому випадку різниці немає.


14
Зверніть увагу , що , як правило , рекомендується використовувати self.(якщо тільки ви не пишете метод геттер / сетер) , навіть якщо ви в даний час є attr_accessor. Це захищає вас від додаткової роботи з рефактором та помилок, якщо згодом ви зміните метод (и) доступу, щоб зробити більше, ніж просто отримати / встановити змінну екземпляра. (Або якщо хтось інший виправляє або підкласує вашу роботу.)
Фрогц

6
Однією з помилок, про яку говорить Фрогз, є те, що якщо ви просто викликаєте attribute = _____ замість self.attribute = ______, ви встановлюєте локальну змінну замість змінної екземпляра.
Jason Noble

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.