ruby snmp:如何将响应自动转换为正确的类型?
在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
情况?看起来很奇怪,它必须手动转换,因为类型已经已知:
需要“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的新手,不知道可以发送这样的方法。谢谢你花了这么多时间回答