转换这个数组:

a = ["item 1", "item 2", "item 3", "item 4"] 

...到哈希值:

{ "item 1" => "item 2", "item 3" => "item 4" }

例如,偶数下标处的元素是键,奇数下标处的元素是值。


当前回答

只用哈希。[]与数组中的值。例如:

arr = [1,2,3,4]
Hash[*arr] #=> gives {1 => 2, 3 => 4}

其他回答

a = ["item 1", "item 2", "item 3", "item 4"]
h = Hash[*a] # => { "item 1" => "item 2", "item 3" => "item 4" }

就是这样。*被称为splat操作符。

@Mike Lewis(在评论中)提醒一句:“要非常小心。Ruby在堆栈上扩展splat。如果你用一个大型数据集来做这件事,预计会让你的堆栈崩溃。”

因此,对于大多数一般的用例,这种方法是很好的,但如果您想对大量数据进行转换,请使用不同的方法。例如,@Łukasz Niemier(也在评论中)为大型数据集提供了这种方法:

h = Hash[a.each_slice(2).to_a]

Ruby 2.1.0在Array上引入了to_h方法,如果原始数组由键-值对数组组成,则该方法可以满足您的需求:http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-to_h。

[[:foo, :bar], [1, 2]].to_h
# => {:foo => :bar, 1 => 2}

枚举器包括Enumerable。从2.1开始,Enumerable也有一个方法#to_h。这就是为什么,我们可以写:-

a = ["item 1", "item 2", "item 3", "item 4"]
a.each_slice(2).to_h
# => {"item 1"=>"item 2", "item 3"=>"item 4"}

因为没有block的#each_slice给了我们Enumerator,并且根据上面的解释,我们可以在Enumerator对象上调用#to_h方法。

你可以这样尝试,对于单个数组

irb(main):019:0> a = ["item 1", "item 2", "item 3", "item 4"]
  => ["item 1", "item 2", "item 3", "item 4"]
irb(main):020:0> Hash[*a]
  => {"item 1"=>"item 2", "item 3"=>"item 4"}

对于数组的数组

irb(main):022:0> a = [[1, 2], [3, 4]]
  => [[1, 2], [3, 4]]
irb(main):023:0> Hash[*a.flatten]
  => {1=>2, 3=>4}

只用哈希。[]与数组中的值。例如:

arr = [1,2,3,4]
Hash[*arr] #=> gives {1 => 2, 3 => 4}