Атрибуты в 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.