Ruby迭代单个键的多个值

时间:2014-03-21 14:19:11

标签: ruby file hash key

好的,所以我有一个带有键的哈希值,其中一些键包含每个键的多个值。我正在尝试创建新文件,其中键是文件名和值写入文本(每行一个值)。这就是我得到的。

    @agencyList.each do |domain, email|
        File.open(domain.to_s, "w") { |file| file.write(email) }
    end

问题是只将值集的第一个元素输出到文件中。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

据我所知,@agencyListHash es的数组。例如:

@agencyList = [
  {domain: 'domain1', email: 'email11'},
  {domain: 'domain1', email: 'email12'},
  {domain: 'domain2', email: 'email21'},
]

因此,在这种情况下,File.open(domain.to_s, "w")的文件模式不正确。 w将重新创建一个新文件,因此该文件将始终只包含一个值 - 最后一个值。

尝试使用a模式打开文件,并通过puts写入行以确保值位于不同的行:

@agencyList.each do |hash|
  File.open(hash[:domain].to_s, "a") { |file| file.puts(hash[:email]) }
end

但如果你说

  

我有一个带键的哈希值,其中一些键包含每个键的多个值

Hash不能包含具有相同键的值。因此,您的@agencyListHash,并且应该将值作为数组:

@agencyList = {
  'key1' => ['val11', 'val12'],
  'key2' => ['val21'],
]

如果是这样,你的代码应该是这样的:

@agencyList.each do |domain, emails|
  File.open(domain.to_s, "w") do |file|
    emails.each do |email|
      file.puts(email)
    end
  end
end

答案 1 :(得分:0)

您需要遍历电子邮件集

domains.each { |domain, emails|
   File.open(domain, 'w'){ |f|
      emails.each { |email|
         f.puts(email)
      }
   }
}