С чем является самая короткая, острота способом перечислить все методы, определенные attr_accessor
? Я хотел бы сделать его так, если у меня есть класс MyBaseClass
, что-либо, что расширяет это, я могу добраться attr_accessor
определенный в подклассах. Что-то вроде этого:
class MyBaseClass < Hash
def attributes
# ??
end
end
class SubClass < MyBaseClass
attr_accessor :id, :title, :body
end
puts SubClass.new.attributes.inspect #=> [id, title, body]
Что относительно отобразиться просто attr_reader
и attr_writer
определения?
Невозможно (однострочно или иначе) перечислить все методы, определенные attr_accessor, и только методы, определенные attr_accessor, без определения вашего собственного attr_accessor.
Вот решение, которое переопределяет attr_accessor в MyBaseClass, чтобы запомнить, какие методы были созданы с использованием attr_accessor:
class MyBaseClass
def self.attr_accessor(*vars)
@attributes ||= []
@attributes.concat vars
super(*vars)
end
def self.attributes
@attributes
end
def attributes
self.class.attributes
end
end
class SubClass < MyBaseClass
attr_accessor :id, :title, :body
end
SubClass.new.attributes.inspect #=> [:id, :title, :body]