Подтвердить что ты не робот

Attr vs attr_accessor

В Ruby существует четыре разных метода getter и setter для переменных экземпляра, attr, attr_reader, attr_writer и attr_accessor. Вопрос в том, находится ли в Ruby attr :dilithium, то же, что и attr_reader :dilithium, и идентичен attr_accessor :dilithium, если передан дополнительный параметр true? То есть

class Enterprise
  attr :dilithium, true

идентичен

class Enterprise
  attr_accessor :dilithium

Являются ли две функции attr и attr_accessor более или менее избыточными?

4b9b3361

Ответ 1

Одно отличие состоит в том, что attr_accessor и друзья понятнее, а необязательный логический аргумент attr теперь устарел. Помимо этого, и тот факт, что attr не имеет документации, нет никакой реальной разницы.

Ответ 2

В Ruby 1.8, attr может определять только один атрибут с необязательным true для создания сеттера. В 1.9 он ведет себя как attr_reader: он позволяет использовать несколько атрибутов. Как говорит @Linuxios, необязательное логическое значение устарело.

Ответ 3

Если вы посмотрите на код C в Ruby 2.3.0, вы увидите, что attr и attr_reader фактически выполняют одно и то же (за исключением устаревшего кода). Они являются по существу эквивалентными функциями.

Для меня основные отличия заключаются в следующем:

attr немного легче записать, поскольку он короче. Мне нравится то, как оно себя чувствует в контексте функционального/неизменяемого программирования (в этих контекстах attr_writer и attr_accessor не имеют значения, и поэтому использование attr_reader кажется многословным и избыточным).

attr с несколькими переменными экземпляра затрудняет документирование, за исключением особых ситуаций, например.

# The coordinates in WGS84.
attr :x, :y

# The location name.
attr :name

# The popularity of the location.
attr :popularity

Было бы сложнее документировать :name и :popularity независимо, если они были в одной строке attr :name, :popularity.

Кроме того, это сводится к личным предпочтениям. На практике нет разницы в производительности или какой-либо другой разницы.