2014-01-11 67 views
0

我需要一个哈希,其中的键由字符数组表示。 但是,当我有这样的数组:散列字符数组作为键

a = %w(a b c), b = %w(d e f), c = %w(g h i) 

和我创建一个新的Hash,并尝试给它的价值观,我的结果很奇怪,我希望类似这样:

H = { ["a", "b", "c"] => 1, ["d", "e", "f"] => 2 } 

但我得到这样的:

{"[\"a\", \"b\", \"c\"]"=>1} 

我创建这个哈希的方法很简单:

H = {} 
H["#{array_name}"] 

这是正常的行为吗?如果是这样,我怎么能让这些键正常的字符数组?

+1

' “#{}变量”'是字符串插值。所以你将数组转换为字符串表示。并将该字符串设置为键。 – Charlie

+1

库巴,你应该检查Ruby的[命名约定](http://rubylearning.com/satishtalim/ruby_names.html)。变量用小写字母书写。你可以使用'h ='或'my_hash ='而不是'H ='。 –

+0

@CarySwoveland我同意你的意见。 –

回答

3

a,b,c是局部变量。它们不是数组名称。他们持有3个不同Array实例的参考。所以,做如下:

a = %w(a b c) 
b = %w(d e f) 
c = %w(g h i) 
H = {} 
H[a] = 1 
H[b] = 2 
H[c] = 3 
H # => {["a", "b", "c"]=>1, ["d", "e", "f"]=>2, ["g", "h", "i"]=>3} 

一个Rubyish方式:

a = %w(a b c), %w(d e f), %w(g h i) 
Hash[a.zip([1,2,3])] 
# => {["a", "b", "c"]=>1, ["d", "e", "f"]=>2, ["g", "h", "i"]=>3} 
+0

好极了,我以为你必须定义哈希键与“” – Leo

+1

或新的to_h:'a.zip [1,2,3])。to_h'。 – steenslag

+0

@steenslag它是2.1的功能...? –