Атрибуты в Ruby
В этой статье мы собираемся изучить следующие темы:
- метод
attr
- метод
attr_reader
attr_writer
методattr_accessor
метод- ленивая инициализация
Прежде, чем начать
Позвольте мне представить здесь платформу, которая помогла мне изучить большую часть моих знаний о Ruby. Действительно, Pluralsight - потрясающая платформа.
С 50+ курсами, которые охватывают различные темы по Ruby и Ruby on Rails, это лучший способ поднять свои знания на новый уровень!
Попробуйте бесплатно 👇😉
Спасибо за уделенное время!
Вступление
В ООП важна концепция member access control
, поскольку она позволяет контролировать доступ к инкапсулированным переменным.
Во многих языках программирования эта концепция реализована с использованием getters
и setters
для каждого члена.
В Ruby методы attr_*
отвечают за member access control
.
attr
Метод attr
создает переменную экземпляра и метод получения для каждого имени атрибута, переданного в качестве аргумента.
Аргументом может быть Symbol
или String
, который будет преобразован в Symbol
module Attr attr :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1, :attr2]
В приведенном выше примере модуль Attr
включает 2 метода экземпляра, которые позволяют читать значения attr1
и attr2
.
attr_reader
Метод attr_reader
аналогичен методу attr
.
module Attr attr_reader :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1, :attr2]
attr_writer
Метод attr_writer
создает переменную экземпляра и метод установки для каждого имени атрибута, переданного в качестве аргумента.
Аргументом может быть Symbol
или String
, который будет преобразован в Symbol
module Attr attr_writer :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1=, :attr2=]
В приведенном выше примере модуль Attr
включает 2 метода экземпляра, которые позволяют изменять значение attr1
и attr2
.
attr_accessor
Метод attr_accessor
создает переменную экземпляра, метод получения и метод установки для каждого имени атрибута, переданного в качестве аргумента.
Аргументом может быть Symbol
или String
, который будет преобразован в Symbol
module Attr attr_accessor :attr1, 'attr2' end irb> Attr.instance_methods.sort => [:attr1, :attr1=, :attr2, :attr2=]
В приведенном выше примере модуль Attr
включает 4 метода экземпляра, которые позволяют читать и изменять значения attr1
и attr2
.
Ленивая инициализация
В предыдущих примерах я говорил вам, что attr_*
методы создают переменные экземпляра. Это почти правда.
Фактически, переменные экземпляра, созданные attr_*
методами, используют механизмlazy initialization
.
Это означает, что переменные экземпляра инициализируются только при вызове метода установки - или когда переменная экземпляра явно устанавливается в методе экземпляра.
class Website attr_accessor :link, :title def initialize @title = "The best Ruby newsletter" end end irb> website = Website.new => #<Website:0x00777 @title="The best Ruby newsletter"> irb> website.instance_variables => [:@title] irb> website.link = "http://ruby.devscoop.fr" => "http://ruby.devscoop.fr" irb> website.instance_variables [:@title, :@link]
В приведенном выше примере переменная экземпляра @title
явно создается в методе Website#initialize
.
Итак, эта переменная экземпляра доступна в массиве, возвращенном первым вызовом instance_variables
.
Обратите внимание, что переменная экземпляра @link
еще не создана, несмотря на вызов attr_accessor
. Эта переменная экземпляра создается только после вызова метода Website#link=
.
Таким образом, при использовании методов the attr_*
переменная экземпляра, связанная с каждым именем аргумента, будет создана только тогда, когда мы установим для нее значение (используя метод установки или явно присвоив ему значение).
Вуаля!
Спасибо, что нашли время прочитать этот пост :-)
Не стесняйтесь 👏 и поделитесь этой статьей, если она была для вас полезна.
Вот ссылка на мою последнюю статью: The Comparable mixin
.