Fastest/One-liner способ перечислить attr_accessors в Ruby?

С чем является самая короткая, острота способом перечислить все методы, определенные 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 определения?

31
задан Lance Pollard 21 March 2010 в 14:04
поделиться

1 ответ

Невозможно (однострочно или иначе) перечислить все методы, определенные 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]
39
ответ дан 27 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: