2011-04-23 5 views
2

일부 센서 정보를 읽고 해시로 반환하는 클래스 작업 중입니다. 나는 해시 키를 접근 자로 사용하고 싶지만, 나는 그것을 얻는 것이별로 행운이 아니다. 여기까지 내 코드의 관련 부분은 다음과 같습니다.클래스의 접근 자로서 해쉬 키

나는 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]의 출력을 얻는 것입니다. 현재 내가 알 수있는 것은 정의되지 않은 메소드 오류입니다. 아무도 내가 여기서 뭘 잘못하고 있는지 알지 못해?

답변

3

간단한 예입니다. 당신의 해시를 원숭이처럼 패치하지 않는 이유가 있습니까?

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" 
+0

이것은 내가 찾고있는 것입니다. method_missing 메서드를 Hash 클래스에 넣어야한다는 것을 알지 못했습니다. 그것은 트릭을했다. – Eugene

4

아마도 OpenStruct는 원하는 것을 수행합니다. doc에서 : "데이터에 접근하는 다른 방식의 해시와 비슷합니다. 실제로 해시로 구현되며 하나를 사용하여 초기화 할 수 있습니다."

require 'ostruct' 
s=OpenStruct.new({:sensor_name=>'sensor1',:data=>['something',1,[1,2,3]]}) 
p s.sensor_name 
#=> "sensor1" 
관련 문제