Ответ 1
Одно отличие состоит в том, что attr_accessor
и друзья понятнее, а необязательный логический аргумент attr
теперь устарел. Помимо этого, и тот факт, что attr
не имеет документации, нет никакой реальной разницы.
В 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
более или менее избыточными?
Одно отличие состоит в том, что attr_accessor
и друзья понятнее, а необязательный логический аргумент attr
теперь устарел. Помимо этого, и тот факт, что attr
не имеет документации, нет никакой реальной разницы.
В Ruby 1.8, attr
может определять только один атрибут с необязательным true
для создания сеттера. В 1.9 он ведет себя как attr_reader
: он позволяет использовать несколько атрибутов. Как говорит @Linuxios, необязательное логическое значение устарело.
Если вы посмотрите на код 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
.
Кроме того, это сводится к личным предпочтениям. На практике нет разницы в производительности или какой-либо другой разницы.