У меня есть некоторый Ruby-код, который использует защищенный уровень attr_readers, чтобы иметь возможность реализовать метод ==, чтобы мы могли утверждать, что некоторый результирующий календарь равен ожидаемому календарю), но эти защищенные средства доступа не понадобятся ни для какого кода, кроме утверждения в тестовом коде.
Какой-то код у меня выглядит следующим образом:
class Calendar
def initialize(date_times)
@date_times = date_times
end
def next_date_time
@date_times.find { |time| time - DateTime.now > 0 }
end
def ==(other)
@date_times == other.date_times
end
protected
attr_reader :date_times
end
Как мне избежать необходимости защищенных attr_readers? На самом деле, в идеале было бы неплохо, если бы я мог убрать необходимость и в def==(......
, поскольку он также необходим только для тестов!
Всего наилучшего,
Alex
Первый удар в этом:
module Kernel
def subclass_with_equals(class_symbol)
clazz = Kernel.const_get(class_symbol.to_s)
Kernel.subclass_with_default_equals(clazz)
end
private
def self.subclass_with_default_equals(base_class)
sub_class = Class.new(base_class)
sub_class.class_eval do
def ==(other)
instance_variables.all? { |v| self.instance_variable_get(v) == other.instance_variable_get(v) } and other.instance_of? self.class
end
end
sub_class
end
end
И в верхней части моего spec-файла я могу добавить эту строку, чтобы добавить метод по умолчанию == в мой класс:
Calendar = sub_class_with_equals :Calendar
Это позволяет мне удалить пять или шесть строк из моего класса Календаря!