【问题标题】:Naming Var using Var使用 Var 命名 Var
【发布时间】:2014-10-20 22:23:05
【问题描述】:

我正在尝试动态创建数组并且正在搞乱这段代码,但我没有得到任何结果。

locations开头:

locations = {"boston" => 1, "new_york" => 2 , "miami" => 3}

并使用:

locations.each {
|city, id|  puts "#{city}_angels"
}

期望的结果是初始化三个数组:boston_angelsnew_york_angelsmiami_angels

【问题讨论】:

  • 它们需要是局部变量吗?为什么不使用包含 bostonnew_yorkmiami 键的 angels 哈希?
  • 我想一个带有数组的哈希值可以工作。你将如何初始化空数组?

标签: ruby arrays hashmap


【解决方案1】:

根据问题上的 cmets,有很多方法可以从可枚举的源构造散列。 each_with_object 是我的最爱之一:

locations.keys.each_with_object({}) {|city, out| out[city] = [] }

inject/reduce 是另一种选择:

locations.keys.inject({}) {|h, city| h[city] = []; h }

您还可以创建一个由[city, []] 数组组成的数组,然后将其转换为哈希:

Hash[*locations.flat_map {|city, id| [city, []] }]

或者,如果您使用的是 Ruby 2.1:

locations.keys.map {|k| [k, []] }.to_h

【讨论】:

    【解决方案2】:

    这个问题与哈希location的值无关,所以我们开始吧:

    cities = locations.keys
      #=> ["boston", "new_york", "miami"]
    

    其他三种方法:

    #1

    Hash[cities.map { |c| [c, []] }]
      #=> {"boston"=>[], "new_york"=>[], "miami"=>[]}
    

    使用 Ruby 2.1+,您可以将 Hash[arr] 写为 arr.to_h

    #2

    cities.reduce({}) { |h,city| h.merge({ city=>[] }) }
    

    #3

    h = Hash.new { |h,k| h[k] = [] }
    h.values_at(*cities)
    h
      #=> {"boston"=>[], "new_york"=>[], "miami"=>[]}
    

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2017-02-20
      相关资源
      最近更新 更多