Initialize a Ruby class from an arbitrary hash, but only keys with matching accessors

后端 未结 6 608
遇见更好的自我
遇见更好的自我 2021-01-01 04:00

Is there a simple way to list the accessors/readers that have been set in a Ruby Class?

class Test
  attr_reader :one, :two

  def initialize
    # Do someth         


        
6条回答
  •  余生分开走
    2021-01-01 04:23

    You could override attr_reader, attr_writer and attr_accessor to provide some kind of tracking mechanism for your class so you can have better reflection capability such as this.

    For example:

    class Class
      alias_method :attr_reader_without_tracking, :attr_reader
      def attr_reader(*names)
        attr_readers.concat(names)
        attr_reader_without_tracking(*names)
      end
    
      def attr_readers
        @attr_readers ||= [ ]
      end
    
      alias_method :attr_writer_without_tracking, :attr_writer
      def attr_writer(*names)
        attr_writers.concat(names)
        attr_writer_without_tracking(*names)
      end
    
      def attr_writers
        @attr_writers ||= [ ]
      end
    
      alias_method :attr_accessor_without_tracking, :attr_accessor
      def attr_accessor(*names)
        attr_readers.concat(names)
        attr_writers.concat(names)
        attr_accessor_without_tracking(*names)
      end
    end
    

    These can be demonstrated fairly simply:

    class Foo
      attr_reader :foo, :bar
      attr_writer :baz
      attr_accessor :foobar
    end
    
    puts "Readers: " + Foo.attr_readers.join(', ')
    # => Readers: foo, bar, foobar
    puts "Writers: " + Foo.attr_writers.join(', ')
    # => Writers: baz, foobar
    

提交回复
热议问题