2011-06-13 79 views

回答

5

是,Hash#keys返回哈希的键作为一个阵列,即哈希和Hash#keys返回的数组是完全相互独立的:

a = {} 
b = a.keys 
c = a.keys 

b << :foo 

a # still {} 
b # [:foo] 
c # still [] 

a[:bar] = :baz 

a # {:bar => :baz} 
b # still [:foo] 
c # still [] 
+2

+1提及它是一个新数组,并且对其进行更改不会影响底层哈希。 – 2011-06-13 23:48:06

1

从hash.keys的文档:

返回一个新的数组,填充此散列中的键。另请参阅哈希值。

所以这个类是Array,因为返回值是一个数组。

关于您的问题“哈希中的键是否认为是自己的数组?”,它们是“kind”,Ruby中的哈希以struct(st_table)的形式实现,它包含指向其每个条目的指针列表(st_table_entry)中,st_table_entry包含密钥和它的值,所以我猜想keys方法所做的只不过是遍历每个密钥。

您可以阅读这篇文章伊利亚·格里戈里克的,他解释了红宝石http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/

-1

你觉得有自相矛盾的地方好多了哈希?请记住,哈希不是Ruby中的数组。

+0

我不确定从你的回复中得到什么。我问了一个非常简单的问题,承认完全无知......不确定你的回答是否符合“答案”,尽管关于哈希不是数组的部分是有帮助的。 – LuxuryMode 2011-06-16 00:27:04

+0

@LuxuryMode:我只是想澄清你的问题。您可以通过执行'{} .keys.class'来判断这些键的确是一个Array。我只是问你是否对这种行为感到惊讶。如果你觉得有些令人惊讶的事情,那么描述你为什么认为这很令人惊讶会帮助我更好地回答你的问题。因为这个,你是否因此而失败了? – 2011-06-16 00:48:53