【问题标题】:Ruby iterate over multiple values for single keyRuby 遍历单个键的多个值
【发布时间】:2014-04-28 23:24:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby file hash key


    【解决方案1】:

    正如我正确理解的那样,@agencyListHashes 的数组。例如:

    @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 不能包含具有相同键的值。所以你的 @agencyList 是一个 Hash 并且应该有一个数组的值:

    @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
    

    【讨论】:

      【解决方案2】:

      您需要遍历电子邮件集

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

      【讨论】:

      • 对于多行块使用do..end...而不是{..}
      • 感谢 Arup,为了清楚起见?或者也有技术差异,干杯。
      • ste,这只是按照 Arup 建议的做法。大多数 Rubiest 认为使用 do/end 代替大括号会更容易阅读多行结构。你可能不同意,但是对于遵循约定有一些话要说,尤其是当你学习一门新的编程语言时。顺便说一句,Arup 不会被通知您回复了他的评论(因此可能永远不会看到它)。如果您希望他收到通知,请在他的名字前加上@(即@Arup)。
      • @CarySwoveland 感谢您通知我并得到很好的解释。 OP - 用这句话搜索link - 对于单行块,首选{...} 而不是do...end
      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多