Я работаю над классом, который читает некоторую информацию от датчика и возвращает ее в виде хэша. Я хотел бы использовать хеш-ключи в качестве аксессоров, но мне не очень повезло, что все заработало. Вот соответствующие части моего кода:
Я пробовал это как с 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]
. В настоящее время я могу получить только неопределенную ошибку метода. У кого-нибудь есть идеи, что я здесь делаю не так?