Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby snmp:如何将响应自动转换为正确的类型?_Ruby_Snmp - Fatal编程技术网

ruby snmp:如何将响应自动转换为正确的类型?

ruby snmp:如何将响应自动转换为正确的类型?,ruby,snmp,Ruby,Snmp,在ruby中,我阅读了一些SNMP寄存器。响应是一个对象数组 是否有一种很好的方法可以将每个对象转换为正确的类型,以避免在以下代码中出现情况?看起来很奇怪,它必须手动转换,因为类型已经已知: 需要“snmp” 主机='127.0.0.1'。冻结 寄存器=['sysContact.0','sysUpTime.0', 'upidentManufacturer.0'、'upidentModel.0'、'upidentName.0'] 参数数组={} SNMP::Manager.open(主机:主机)d

在ruby中,我阅读了一些SNMP寄存器。响应是一个对象数组

是否有一种很好的方法可以将每个对象转换为正确的类型,以避免在以下代码中出现
情况?看起来很奇怪,它必须手动转换,因为类型已经已知:

需要“snmp”
主机='127.0.0.1'。冻结
寄存器=['sysContact.0','sysUpTime.0',
'upidentManufacturer.0'、'upidentModel.0'、'upidentName.0']
参数数组={}
SNMP::Manager.open(主机:主机)do | Manager|
manager.load_模块(“UPS-MIB”)
response=manager.get(寄存器)
response.each_varbind do|vb|
##################################
#从这里换车。。。
值=零
案例vb.value.asn1_类型

当“OCTET STRING”#查看中的代码时,似乎没有相应的方法。我想你可以试着用猴子来修补它,但不确定是否值得麻烦

如果不喜欢开关语法,可以使用如下哈希查找:

require 'snmp'

HOST = '127.0.0.1'.freeze

TYPE_VALUES = {
  'OCTET STRING' => :to_s,
  'INTEGER' => :to_i,
  'TimeTicks' => :to_s
}.freeze

registers = ['sysContact.0', 'sysUpTime.0',
             'upsIdentManufacturer.0', 'upsIdentModel.0', 'upsIdentName.0']

params_array = {}

SNMP::Manager.open(host: HOST) do |manager|
  manager.load_module('UPS-MIB')
  response = manager.get(registers)
  response.each_varbind do |vb|
    if method = TYPE_VALUES[vb.value.ans1_type]
      params_array[vb.name.to_s] = vb.value.send(method)
    else
      puts "Type '#{vb.value.asn1_type}' not recognized!"
      exit(1)
    end
  end
end
pp params_array

非常优雅的解决问题的方法,即使我对无法自动转换为类型感到失望(至少对于常见的类型:TimeTicks可以通过多种方式转换)。我是Ruby的新手,不知道可以发送这样的方法。谢谢你花了这么多时间回答