Fastest/One-liner way to list attr_accessors in Ruby?

前端 未结 6 826
忘了有多久
忘了有多久 2020-12-02 14:16

What\'s the shortest, one-liner way to list all methods defined with attr_accessor? I would like to make it so, if I have a class MyBaseClass, any

6条回答
  •  [愿得一人]
    2020-12-02 14:57

    Heres an alternative using a mixin rather than inheritance:

    module TrackAttributes
      def attr_readers
        self.class.instance_variable_get('@attr_readers')
      end
    
      def attr_writers
        self.class.instance_variable_get('@attr_writers')
      end
    
      def attr_accessors
        self.class.instance_variable_get('@attr_accessors')
      end
    
      def self.included(klass)
        klass.send :define_singleton_method, :attr_reader, ->(*params) do
          @attr_readers ||= []
          @attr_readers.concat params
          super(*params)
        end
    
        klass.send :define_singleton_method, :attr_writer, ->(*params) do
          @attr_writers ||= []
          @attr_writers.concat params
          super(*params)
        end
    
        klass.send :define_singleton_method, :attr_accessor, ->(*params) do
          @attr_accessors ||= []
          @attr_accessors.concat params
          super(*params)
        end
      end
    end
    
    class MyClass
      include TrackAttributes
    
      attr_accessor :id, :title, :body
    end
    
    MyClass.new.attr_accessors #=> [:id, :title, :body]
    

提交回复
热议问题