Хеш-ключи как аксессоры в классе - PullRequest
2 голосов
/ 23 апреля 2011

Я работаю над классом, который читает некоторую информацию от датчика и возвращает ее в виде хэша. Я хотел бы использовать хеш-ключи в качестве аксессоров, но мне не очень повезло, что все заработало. Вот соответствующие части моего кода:

Я пробовал это как с method_missing, так и с использованием метода :define_method.

  attr_reader :sensor_hash

  def method_missing(name, *args, &blk)
    if args.empty? && blk.nil? && @sensor_hash.has_key?(name.to_s)
      @sensor_hash[name.to_s]
    else
      super
    end
  end

  def sensor(*sensor_to_return)
    sensor_output = run_command(this_method_name)
    sensor_output = sensor_output.split("\n")
    sensor_output.map! { |line| line.downcase! }
    unless sensor_to_return.empty?
      sensor_to_return = sensor_to_return.to_s.downcase
      sensor_output = sensor_output.grep(/^#{sensor_to_return}\s/)
    end
    @sensor_hash = Hash.new
    sensor_output.each { |stat| @sensor_hash[stat.split(/\s+\|\s?/)[0].gsub(' ','_').to_sym] = stat.split(/\s?\|\s?/)[1..-1].each { |v| v.strip! } }
    @sensor_hash.each do |k,v|
      puts v.join("\t")
      self.class.send :define_method, k { v.join("\t") }
    end
    return @sensor_hash

Возвращенные данные - это хеш с именем датчика в качестве ключа, а значение - массив всего остального. Моя цель - иметь возможность позвонить Class.sensor.sensor_name и получить вывод Class.sensor[:sensor_name]. В настоящее время я могу получить только неопределенную ошибку метода. У кого-нибудь есть идеи, что я здесь делаю не так?

Ответы [ 2 ]

4 голосов
/ 23 апреля 2011

Может быть, OpenStruct делает то, что вы хотите. Из doc : «Это похоже на хэш с другим способом доступа к данным. На самом деле, он реализован с помощью хэша, и вы можете инициализировать его с одним».

require 'ostruct'
s=OpenStruct.new({:sensor_name=>'sensor1',:data=>['something',1,[1,2,3]]})
p s.sensor_name
#=> "sensor1"
3 голосов
/ 23 апреля 2011

Просто быстрый пример.Есть ли у вас какие-либо причины, чтобы не исправлять ваш хэш?

irb(main):001:0> class Hash
irb(main):002:1> def method_missing(name, *args, &blk)
irb(main):003:2>   if self.keys.map(&:to_sym).include? name.to_sym
irb(main):004:3>     return self[name.to_sym]
irb(main):005:3>   else
irb(main):006:3*     super
irb(main):007:3>   end
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):012:0> h = {:hello => 'world'}
=> {:hello=>"world"}
irb(main):013:0> h.hello
=> "world"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...