添加到类ruby中的现有哈希

时间:2013-06-05 12:58:51

标签: ruby

我正在尝试创建一个具有如下数据结构的哈希:

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

它工作并成功创建了一个具有我想要的结构的哈希,但是当我再次运行时,它会覆盖现有的哈希值。我希望它继续添加它,所以我可以创建一个“运行选项卡”。

1 个答案:

答案 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 }