我正在尝试创建一个具有如下数据结构的哈希:
hash = {
:a => { :a1 => "x", :a2: => "x", :a3 => "x" },
:b => { :b1 => "x", :b2: => "x", :b3 => "x" },
}
在类函数内部。我对OO很新,所以也许我不能正确理解变量范围。
这是我的代码:
class Foo
# Control class args
attr_accessor :site, :dir
# Initiate our class variables
def initialize(site,dir)
@site = site
@dir = dir
#@records = {}
@records = Hash.new { |h, k| h[k] = Hash.new }
end
def grab_from_it
line = %x[tail -1 #{@dir}/#{@site}/log].split(" ")
time = line[0, 5].join(" ")
rc = line[6]
host = line[8]
ip = line[10]
file = line[12]
@records = { "#{file}" => { :time => "#{time}", :rc => "#{rc}", :host => "#{host}", :ip => "#{ip}" } }
end
end
主体:
foo = Foo.new(site,dir)
foo.grab_from_it
pp foo
sleep(10)
foo.grab_from_it
pp foo
它工作并成功创建了一个具有我想要的结构的哈希,但是当我再次运行时,它会覆盖现有的哈希值。我希望它继续添加它,所以我可以创建一个“运行选项卡”。
答案 0 :(得分:2)
替换以下行
@records = { "#{file}" => { :time => "#{time}", :rc => "#{rc}", :host => "#{host}", :ip => "#{ip}" } }
与
@records["#{file}"] = { :time => "#{time}", :rc => "#{rc}", :host => "#{host}", :ip => "#{ip}" }
每次调用@records = {}
时,实例变量都指向新的哈希值。因此initialize
中的初始化代码无效。您应该使用[]=
的{{1}}实例方法,将新条目添加到现有哈希值,而不是使用新哈希值替换初始化哈希值。
顺便说一句,您可以使用Hash
来引用字符串,而不是使用字符串插值variable
创建新字符串。
"#{variable}"
如果您想要哈希的第一层和第二层的 UPDATE 行为,您可以查看Hash#update
方法。
@records[file] = { :time => time, :rc => rc, :host => host, :ip => ip }