0

RRD.createRubyを呼び出そうとしています。私の RRD 変数はハッシュに格納されており、RRD.create呼び出しを作成する必要があります。これが私のコードです:

pool_map = {
  "cleanup"  => "Cleaning up",
  "leased" => "Leased",
  "ready"  => "Ready"
}

start = Time.now.to_i
ti = 60 # time interval, in seconds

RRD.create(
         rrdfile,
         "--start", "#{start - 1}",
         "--step",  ti, # seconds
         pool_map.keys.map{|val| "DS:#{val}:GAUGE:#{ti * 2}:0:U" }.collect,
         "RRA:LAST:0.5:1:#{86400 / ti}",         # detailed values for last 24 hours
         "RRA:AVERAGE:0.5:#{5*60 / ti}:#{7*24*60}", # 5 min averages for 7 days
         "RRA:MAX:0.5:#{5*60 / ti}:#{7*24*60}",     # 5 min maximums for 7 days
         "RRA:AVERAGE:0.5:#{60*60 / ti}:#{183*24}", # 1 hour averages for a half of the year
         "RRA:MAX:0.5:#{60*60 / ti}:#{183*24}"      # 1 hour maximums for a half of the year
        )

ただし、Ruby から次のエラーが発生します。

in `create': invalid argument - Array, expected T_STRING or T_FIXNUM on index 5 (TypeError)

RRD.create配列を渡す代わりに、いくつかの文字列を指定する必要があります。Rubyでこれを行うにはどうすればよいですか?

PS http://oss.oetiker.ch/rrdtool/prog/rrdruby.en.html

4

1 に答える 1

2

「splat」演算子 (単項アスタリスク) が必要です。

*pool_map.keys.map{|val| ...}

最後には必要ないことに注意してくださいcollect。何もしません! collectは単なるエイリアスでmapあり、ブロックを渡していないため、何もしていません。

Splat は配列を分解するのに非常に便利です:

arr = [1, 2, 3]
a, b, c = *arr
# a = 1; b = 2; c = 3

そして、あなたがやろうとしているように、メソッドに引数を供給するためにそれを使うことがよくあります

def sum_three_numbers(x, y, z)
  x + y + z
end

arr = [1, 2, 3]
sum_three_numbers(*arr)
# => 6

arr = [1, 2]
sum_three_numbers(100, *arr)
# => 103
于 2013-01-15T19:06:40.447 に答える