Как стать автором
Обновить

Комментарии 14

Принцип «наименьшей неожиданности», говорите?
get_a / set_a — что это за джава-отрыжки? Так на руби не пишут.
Я думаю автор так написал, чтобы лучше продемонстрировать суть проблемы, описываемой в статье. Всё же код приведенный тут, не есть законченная программа, а учебный код.
Это только вносит путаницу. Потому что следом у него используется attr_accessor. И клиентский код меняется. Я не завидую тем, кто по такому коду будет учиться :)
а во что превращается attr_accessor?

«Всегда нужно знать на уровень ниже той абстракции, которой пользуешься» (с) джоэль
attr_accessor раскрывается в пару идиоматично оформленных методов, а не отрыжек из джавы :)

Код по ссылке: pastie.org/5410836
ибо здешний парсер не работает нихрена.

Т. е. претензия в том, что геттеры и сеттеры у автора не идиоматичные?
Ага, именно.
Не стоит придумывать отдельное такое понятие, как «Class-level instance variable» :) Есть просто Instance variable, привязанная к объекту. В каждом конкретном контексте Instance-переменная привяжется к объекту, на который указывает self. Self меняется не очень часто, есть весьма небольшой набор т.н. «Scope Gates», при прохождении через которые может измениться(и скорее всего изменится) self. Это ключевые слова class, module, def, а так же методы instance_eval и class_eval

И заявленное равенство «self.class.attr_accessor :a» и «class << self; attr_accessor :a; end;» неверно
Обойти private можно легко, для этого достаточно воспользоваться публичным методом send. Но вариант с «self.class» добавит attr_accesor :a ДЛЯ ВСЕХ объектов, которые являются инстансами класса Class. А вариант с eigenclass'ом — только для нашего класса, что нам и нужно.

class A;
end;

A.a # => NoMethodError: undefined method `a' for A:Class

class B
  self.class.send(:attr_accessor, :a)
end

B.a = 2 # => 2
B.a # => 2
A.a # => nil
Оно понятно, что есть только self и переменные лежат на нем. Но на уровне «пальцев» требуется различать обычные instance vars, class instance vars и class vars. В разговоре чтобы было понятно хотя бы.
Class variable и Instance variable — это две разные сущности (имеют разную семантику и синтаксис, var и @var соответственно). А такой сущности, как class instance variable, не существует. Мне кажется не стоит людям для мнимой простоты объяснения (которая выльется в непонимание системы на более сложных уровнях) придумывать лишние сущности, система и без них очень лаконичная и красивая :)
Ага. Красивая. Пока рефайнменты не введут. :)
Бегло просмотрев топик так и не понял о каком языке идет речь. Пришлось уже внимательнее перечитать, чтобы ближе к концу понять что речь о руби. Можно хоть в заголовок вынести, или в начало статьи?
Оно в хабе Ruby. Меееелкими буквами под заголовком написано. Я вот тоже через RSS ленту смотрел, пришлось в статью заходить, чтоб понять, что речь о Ruby.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации