Комментарии 14
Принцип «наименьшей неожиданности», говорите?
0
get_a / set_a — что это за джава-отрыжки? Так на руби не пишут.
+2
Я думаю автор так написал, чтобы лучше продемонстрировать суть проблемы, описываемой в статье. Всё же код приведенный тут, не есть законченная программа, а учебный код.
-2
Это только вносит путаницу. Потому что следом у него используется attr_accessor. И клиентский код меняется. Я не завидую тем, кто по такому коду будет учиться :)
+1
а во что превращается attr_accessor?
«Всегда нужно знать на уровень ниже той абстракции, которой пользуешься» (с) джоэль
«Всегда нужно знать на уровень ниже той абстракции, которой пользуешься» (с) джоэль
0
attr_accessor раскрывается в пару идиоматично оформленных методов, а не отрыжек из джавы :)
Код по ссылке: pastie.org/5410836
ибо здешний парсер не работает нихрена.
Код по ссылке: pastie.org/5410836
ибо здешний парсер не работает нихрена.
0
Не стоит придумывать отдельное такое понятие, как «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'ом — только для нашего класса, что нам и нужно.
И заявленное равенство «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
+2
Оно понятно, что есть только self и переменные лежат на нем. Но на уровне «пальцев» требуется различать обычные instance vars, class instance vars и class vars. В разговоре чтобы было понятно хотя бы.
0
Class variable и Instance variable — это две разные сущности (имеют разную семантику и синтаксис,
var
и @var
соответственно). А такой сущности, как class instance variable, не существует. Мне кажется не стоит людям для мнимой простоты объяснения (которая выльется в непонимание системы на более сложных уровнях) придумывать лишние сущности, система и без них очень лаконичная и красивая :)0
Бегло просмотрев топик так и не понял о каком языке идет речь. Пришлось уже внимательнее перечитать, чтобы ближе к концу понять что речь о руби. Можно хоть в заголовок вынести, или в начало статьи?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Class-level instance variables