Ruby中的关联数组

46

Ruby有关联数组吗?

例如:

   a = Array.new
   a["Peter"] = 32
   a["Quagmire"] = 'asdas'

在 Ruby 中创建这样的数据结构最简单的方法是什么?


它是Ruby语言,Ruby on Rails是使用Ruby构建的框架。 - Mustafa Magdi
3个回答

77

与 PHP 不同,Ruby(以及几乎所有其他语言)将数组和哈希表视为两种不同的东西。

http://ruby-doc.org/core/classes/Hash.html

在你的情况下,应该使用:

a = {'Peter' => 32, 'Quagmire' => 'asdas'}

有几本免费的入门级 Ruby 书籍和在线模拟器等资源可供使用。

http://www.ruby-doc.org/


24
换句话说:你只需要将 "a = Array.new" 替换为 "a = Hash.new"。 - Arsen7
值得注意的是,Ruby似乎将哈希与使用哈希进行查找的数据结构混淆了 - 例如哈希表/哈希映射。在大多数其他情况下,这些概念不会混淆。 - jheriko
2
回复:“……[关联]数组和哈希表……在Ruby(以及几乎所有其他语言)中,它们是两个不同的东西。”维基百科列出了另外十几种“像PHP一样”的语言(参见:“关联数组”)——并不是在争论,但感觉这条评论会分散注意力,不利于回答问题。 - HoldOffHunger

33

使用哈希,以下是一些如何入门的示例(所有这些示例都执行相同的操作,只是语法不同):

a = Hash.new
a["Peter"] = 32
a["Quagmire"] = 'asdas'

或者您可以这样做:

a = {}
a["Peter"] = 32
a["Quagmire"] = 'asdas'

甚至只需要一句话:

a = {"Peter" => 32, "Quagmire" => 'gigity'}

1
您也可以像预期的那样进行增量操作:a["Peter"] += 1 等。 - Scott C Wilson

3

为了完整起见,有趣的是注意到 Ruby 确实 提供了 Array#assocArray#rassoc 方法,它们为一个数组中的数组添加了"类似哈希表的查找"功能:

arr = [
  ['London', 'England'],
  ['Moscow', 'Russia'],
  ['Seattle', 'USA']
]

arr.assoc('Seattle') #=> '['Seattle', 'USA']
arr.rassoc('Russia') #=> ['Moscow', 'Russia']

请记住,与Ruby哈希表查询时间为常数O(1)不同,assocrassoc的查询时间是线性时间O(n)。你可以通过查看每个方法在Github上的Ruby源代码来了解其中原因。

因此,尽管在理论上你可以使用一个数组的数组来实现Ruby中的“哈希”,但如果你没有任何控制权,可能只有在以某些外部API接收到一个数组的数组时,才会想要使用assoc/rassoc方法,在几乎所有其他情况下,使用哈希表将是更好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接