Ruby 将返回的数组强制转换为适当的值
我有下面的代码片段,我试图将其作为整数和字符串数组返回到ShoesRuby 将返回的数组强制转换为适当的值,ruby,shoes,Ruby,Shoes,我有下面的代码片段,我试图将其作为整数和字符串数组返回到Shoes Shoes.setup do gem 'snmp' end class SNMPManager require 'snmp' include SNMP attr_accessor :hostname, :framerate def initialize(params = {}) @hostname = params.fetch(:hostname, 'localhost') @
Shoes.setup do
gem 'snmp'
end
class SNMPManager
require 'snmp'
include SNMP
attr_accessor :hostname, :framerate
def initialize(params = {})
@hostname = params.fetch(:hostname, 'localhost')
@framerate = params.fetch(:framerate, 25)
end
def getValues
Manager.open(:host => @hostname, :mib_modules => ["SNMPv2-MIB"]) do |manager|
poolArray = []
ifTable = ObjectId.new("1.3.6.1.4.1.15248.2.5.1.3.1")
manager.walk(ifTable) do |row|
poolArray.push(row.inspect)
end
groups = poolArray.group_by{ |s| s.split(',').first[/\d+$/] }
@values = groups.map{ |key, ary| ary.map{ |s| s[/value=(\S+)/, 1] } }
end
end
def to_s
return @values
end
end
Shoes.app do
#@hostname = edit_line
#man =SNMPManager.new(:host => @hostname)
man = SNMPManager.new
man.getValues
puts 'SNMP Space Monitor'
man.to_s.each {|v|
@note = para "#{v[1]} \t(Pool: #{v[0]}) \tCapacity: #{v[3].to_i} \tFree Protons: #{v[2].to_i} \tPercent Free: %#{(v[3].to_f/v[2].to_f*100).round(2)}"
}
end
出于某些原因,鞋的显示方式如下:
但是,如果我正常运行ruby脚本,并用puts输出它,它将正确显示,并正确计算响应。
我知道我遗漏了一些明显的东西,但看不出是什么。
我正试图将该阵列转换为另一个阵列,但这似乎解决了所有问题。1)
这有点奇怪。数组构造函数所做的就是创建@values的副本。您这样做的唯一原因是@values包含对另一个变量引用的某个数组的引用,并且您不希望另一个变量能够更改@values。但是,当您第一次将数组指定给@values时,为什么不进行复制呢
2) 您的to_s方法不返回字符串。1)
这有点奇怪。数组构造函数所做的就是创建@values的副本。您这样做的唯一原因是@values包含对另一个变量引用的某个数组的引用,并且您不希望另一个变量能够更改@values。但是,当您第一次将数组指定给@values时,为什么不进行复制呢
2) 您的to_s方法不会返回字符串。这是一种很好的鞋子使用方法 看起来Shoes为您提供了包含整数数组和字符串的段落
完整的代码将非常有用。这是一种很好的鞋子使用方法 看起来Shoes为您提供了包含整数数组和字符串的段落
完整的代码将非常有用。通过从“红鞋”切换到“绿鞋”解决了问题 不需要其他更改,但这是我当前的代码(当作为控制台应用程序运行时,它会成功超时。但不是作为鞋子应用程序运行-go figure)
通过从“红鞋”切换到“绿鞋”解决了问题 不需要其他更改,但这是我当前的代码(当作为控制台应用程序运行时,它会成功超时。但不是作为鞋子应用程序运行-go figure)
实现1的更好方法是
@values.dup
。2可能是个问题:)可能他想要@值。inspect
无论我尝试了什么,它都会返回相同的数据集-我希望尝试-即使检查了其中的内容,也不会返回我期望的结果。@Scott,你需要发布一个完整的简化示例(带更正)任何人都可以运行并获得与您相同的结果。Array(@values)
将非数组转换为单元素数组。当您的输入可以是单个事物或一组事物时,这是一个常见的习惯用法。实现1的更好方法是@values.dup
。2可能是个问题:)可能他想要@值。inspect
无论我尝试了什么,它都会返回相同的数据集-我希望尝试-即使检查了其中的内容,也不会返回我期望的结果。@Scott,你需要发布一个完整的简化示例(带更正)任何人都可以运行并获得与您相同的结果。Array(@values)
将非数组转换为单元素数组。这是一个常见的习惯用法,用于表示输入可以是单个内容或一组内容。我添加了完整的代码,并将在我更改回控制台输出时添加示例输出,我得到了预期的输出。我添加了完整的代码,并将在我更改回控制台输出时添加示例输出,我得到了预期的输出对setup()的调用为我造成了一个错误:未初始化的常量编码::US_ASCII
。我在shoes邮件列表上问了一个问题,显然shoes是一个独立的包,让shoes导入其他模块不是一件很好的事情。此外,您的to_s()方法仍然没有返回字符串。对setup()的调用会导致我出错:未初始化的常量编码::US_ASCII
。我在shoes邮件列表上问了一个问题,显然shoes是一个独立的包,让shoes导入其他模块不是一件很好的事情。此外,to_s()方法仍然不会返回字符串。
@values = Array(@values)
require 'green_shoes'
gem 'snmp'
class SNMPManager
require 'snmp'
include SNMP
attr_accessor :hostname, :framerate
def initialize(params = {})
@hostname = params.fetch(:hostname, 'localhost')
@framerate = params.fetch(:framerate, 25)
end
def getValues
Manager.open(:host => @hostname) do |manager|
@poolArray = []
poolsTable = ObjectId.new("1.3.6.1.4.1.15248.2.5.1.3.1")
manager.walk(poolsTable) do |row|
@poolArray.push(row.inspect)
end
if @poolArray.empty?
puts "Manager Down"
@poolArray = [
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8650, value=8650 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8651, value=8651 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8650, value=QNewsAK (OCTET STRING)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8651, value=QSuite4AK (OCTET STRING)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8650, value=46835255 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8651, value=11041721 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8650, value=8442357 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8651, value=5717570 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8650, value=0 (INTEGER)]',
'[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8651, value=0 (INTEGER)]',
]
else puts "Manager Up"
end
groups = @poolArray.group_by{ |s| s.split(',').first[/\d+$/] }
@values = groups.map{ |key, ary| ary.map{ |s| s[/value=(\S+)/, 1] } }
end
end
def to_s
return @values
end
protected
end
Shoes.app(:title=>'SNMP Space Monitor') do
man = SNMPManager.new
stack do
every(300) {
man.getValues
man.to_s
man.to_s.each {|v|
para "#{v[1]} \t(Pool: #{v[0]}) \tCapacity: #{v[2].to_i} \tFree Protons: #{v[3].to_i} \tPercent Free: #{(v[3].to_f/v[2].to_f*100).round(2)}%"
}
}
end
end