什么是哈希,它与数组有什么不同?
哈希值,就像数组一样,可以理解为可以被访问、更新和删除的数据列表。只要它们有一些相似之处,它的结构就不同。让我们先来了解一下数组。
["Paris", "Barcelona", 3]
数组一般包含字符串、整数、布尔运算和数组作为值。与数组及其项目互动的方式是通过索引位置。在前面的数组中,巴黎的索引是[0],巴塞罗那的索引是[1],以此类推。
与数组和索引进行交互很容易,但当数据变得更加复杂或项目列表变得更长时,就无法进行扩展。在这里,哈希就显得与众不同了,因为它们用一个键来代替索引位置。
一个键是一个唯一的代表,它与一个值成对。例如,我们可以通过创建一个哈希值来建立一个用户。
user = {
name: "Marie",
city: "Paris",
age: 34
}
在这种情况下,键是 "姓名"、"城市 "和 "年龄",而值是 "玛丽"、"巴黎 "和 "34"。
我们将在后面分析哈希的语法,但现在我们应该能够理解数组和哈希之间的相似之处,最重要的是,它的区别,即。
- 一个数组的索引总是一个整数。
- 散列使用键来识别值。
- 一个键几乎可以是任何对象(字符串、整数、符号、对象)。
使用散列的好处是什么?
首先,哈希值是组织和可视化数据的最佳选择,无论数据结构是简单还是复杂,无论其大小是多少。
使用哈希值在Ruby和Rails应用程序中非常普遍,它被认为是一种最佳做法。此外,哈希值非常容易使用和识别。
最后但并非最不重要的是,哈希值通过使用键而不是依赖索引位置来实现对数据的快速访问。
符号和Ruby的哈希语法
因为哈希的实现已经被证明是非常有效的,它的语法也在不断发展,以改善它的使用。我们现在来看看你在研究现有代码时可能会遇到的不同语法,第一个是 "哈希火箭"。
user = {
"name" => "Marie",
"city" => "Paris",
"age" => 34
}
哈希火箭是非常直观的,但在编写时并不敏捷。 因此,采取了将唯一键转换为符号的方法来简化语法,如下图所示。
user = {
name: "Marie",
city: "Paris",
age: 34
}
请注意,你可能还会看到括号之间的符号。'name':
符号在Ruby中被定义为 "作为标识符的标量值对象,将不可改变的字符串映射到固定的内部值。"换句话说,符号是不能改变的字符串,是唯一的。
符号是首选,因为它们更有效率,比字符串使用更少的内存。在Ruby中,符号在字符串**:name**前用冒号表示,然而当建立哈希时,为了美观,冒号的位置是相反的(见上面的例子)。
嵌套哈希值
嵌套哈希值,也被称为多维哈希值,是指内部包含一个或多个哈希值的哈希值结构。这使得我们可以将数据组织成不同的层次,并建立更加复杂和详细的关联。在从外部API获取响应到你的应用程序中时,你会经常发现这种类型的结构。下面是一个天气API响应的例子。
forecast = {
city: "Barcelona",
coordinates: {
lat: "934876",
lon: "39705"
},
weather: {
status: "cloudy",
wind: "13 km/h",
rain: "0%"
}
}
你应该掌握的5个哈希操作
在清楚地了解了什么是哈希和它的用途之后,我们需要知道如何与它们互动。你可以在Ruby文档中找到可以应用于散列的方法的完整列表,正如你在这一点上可能怀疑的那样,这些方法与数组的方法非常相似。我们现在来看看你应该能够识别和实现哈希值的主要操作。
-
创建哈希值 要创建哈希值,你只需要按照本文上面解释的新旧语法进行操作。请记住,新的语法更容易,并能为你节省一些内存空间。
-
访问哈希值 你可以通过几种方式访问哈希值及其组件。通过简单地调用散列,你将收到它的键和值的完整列表。你可以使用**.key和.values**方法来访问一个哈希的所有键或值。
user.keys #=> ["name", "city", "age"] user.values #=> ["Marie", "Paris", 34]
最重要的是,你可以通过接触其键来访问特定的值。 user[:name] #=> ["Marie"]
这对嵌套哈希也是一样的。forecast[:weather][:status] #=> ["cloudy"]
-
更新要更新一个哈希值,你只需要遵循访问逻辑,然后继续添加、修改或删除值和键的对。
比如说。
user[:name] = "Clara" #=> Changes name value user[:last_name] = "White" #=> Adds pair of key and value to hash -
合并哈希值合并两个或多个哈希值将创建一个新的哈希值,其中包含所有哈希值的键和值(从左到右添加键值对)。合并时有几种处理键值重复的方法,在Ruby文档中已有详细说明。
在下面的例子中,如果有任何键值重复,最后一个键值将被覆盖。
hash1 = {name: "Pete", country: "Germany" }
hash2 = {food: "pasta", beverage: "wate"}
user.merge(hash1, hash2) #=> {name: "Pete", city: "Paris", age: 34, country: "Germany", food: "pasta", beverage: "wate"}
-
遍历 最常见的遍历哈希的方法是使用**.each**方法,并将键和值作为参数传递。
user.each do |key, value| puts "#{key} is the key and #{value} is the value." end #=> "name is the key and Maria is the value." #=> "city is the key and Paris is the value." #=> "age is the key and 34 is the value."
题外话函数式编程中一个著名的方法是map ,这里有一个教程,展示了如何在数组上用索引映射,你可以尝试在哈希上 "用索引映射 "作为一个练习。
总结
在Ruby和使用MVC模式的Rails应用程序中,哈希值被大量使用。这就是为什么值得深入了解哈希的工作原理以及如何充分利用它们的原因。