什么是Ruby哈希?
散列是一种数据结构,用于以UNIQUE键值对的形式存储数据。与数组不同,没有数字索引,你用键来访问散列值。
例子包括:
- 一个国家名称及其相应的国家代码的列表(如ES⇾西班牙)。
- 一本字典,其中每个词都有一个可能的定义列表
- 一个域名和它的IP地址
在正确的情况下,在你的Ruby程序中使用哈希值可以加快你的代码速度。
换句话说:
你的数据是(或可以转化为)类似字典的格式,其中数据可以通过键和相关的值进行分组。
如何创建一个哈希值
我们知道了什么是散列的一般概念,但你如何创建一个散列?
像这样:
{}
这是一个空的哈希!
一个有三个键/值对的哈希看起来像这样:
{ a: 1, b: 2, c: 3 }
其中a 是一个键,而1 是该键的对应值。注意,键值对是用逗号隔开的。
现在:
让我们来看看你如何在你的Ruby项目中使用常见的哈希方法。
在Ruby哈希中存储值
你可以用一组初始值创建一个哈希,正如我们已经看到的。
下面是另一个例子
fruits = { coconut: 1, apple: 2, banana: 3 }
另一个选择是在现有的哈希中添加新的值。
像这样
fruits[:orange] = 4
这是:orange 作为哈希键,而4 作为其对应的值。
为什么当我们访问一个值时,冒号在
:orange之前,而当我们创建一个哈希值时,冒号在orange:之后?这是一种更好的语法,允许你在创建哈希值时不使用hash-rocket (=>) 符号,这是一种有效的、但较老的方法。
值可以是任何Ruby对象。
包括
- 字符串
- 整数和浮点数
- 数组
键也可以是任何东西,但符号(如:banana )和字符串是你最常见的键的类型。
键是唯一的,我们只能有一个:orange 键,或一个:apple 键。
当你两次添加相同的键时,你就会改变它的值。
如何从哈希值中获取数值
你通过键来访问散列。
如果你需要直接访问值,那么散列可能不是你的数据的正确结构。
例子:
fruits[:orange]
# 4
这就是散列的全部意义,通过它的键快速查找一个项目。
如果一个键不存在,你会得到nil 。
fruits[:peach]
# nil
作为一种选择,你可以使用fetch 方法,它允许你提供一个默认值。
例子:
fruits.fetch(:peach, 0)
如果你使用fetch ,而没有默认值(第二个参数),Ruby将引发一个KeyError 异常。
这很有帮助,因为你会知道缺少什么键。
如何合并两个Ruby哈希值
你可以将两个哈希值合并成一个新的哈希值。
什么方法可以做到这一点?
嗯,这并不难猜。该方法的名字是merge 。
下面是如何使用它:
defaults = { a: 1, b: 2, c: 3 }
preferences = { c: 4 }
defaults.merge!(preferences)
# {:a=>1, :b=>2, :c=>4}
注意,由于键是唯一的,较新的值会覆盖较旧的值。
你可以利用这个事实来实现有趣的解决方案,比如创建一个 "默认 "散列,用户可以通过传递自己的散列来覆盖。
如果你需要对键的合并方式进行更多的控制,你可以传递一个块。
像这样:
defaults.merge!(preferences) { |key, old, new| [old, new].max }
其中old 是来自defaults 的值,而new 是来自preferences 的值。
一个键的多个值
在一个字典中...
词是唯一的,但它们可以有多个与之相关的值**(定义**)。
你可以在Ruby中这样做!
例子:
dictionary = {
opportunity: [
"a set of circumstances that makes it possible to do something",
"a situation or condition favorable for attainment of a goal"
],
creativity: [
"the use of imagination or original ideas to create something new",
"the ability to create",
"the process where new ideas emerge from combining existing ideas in new ways"
]
}
dictionary[:creativity][1]
dictionary[:creativity] 给你一个数组,[1] 给你该数组的第二个元素。
换句话说:
键是一个符号,值是数组。当你访问哈希时,你会得到一个数组,你可以像其他数组一样正常访问。
如何对哈希进行排序
你可以对数组进行排序。但是你知道吗,你也可以对哈希进行排序?
当你sort 一个哈希时,它是按键排序的。
例子:
{ b: 1, a: 2 }.sort
# [[:a, 2], [:b, 1]]
但是你也可以按值来排序:
{ c: 3, b: 1, a: 2 }.sort_by(&:last)
你会注意到,你对哈希进行排序得到的不是另一个哈希...
它是一个数组!
但是你可以使用to_h 方法将这个数组转换回散列。
从哈希中获取所有的键和值
如果你想得到一个所有哈希键的列表,好消息是,有一个方法可以做到这一点!
这就是方法:
{ apple: 1, banana: 2 }.keys
# [:apple, :banana]
还有一个方法可以给你一个包含数值的数组。
{ apple: 1, banana: 2 }.values
# [1, 2]
如果你想知道一个键是否存在于散列中,而不是得到一个数组,可以使用key? 方法。
这个方法返回一个true 或false 的值。
总结
你已经了解了Ruby散列,一种由键值对组成的有用的数据结构。你还学习了如何通过键访问哈希,以及如何在哈希中存储新数据。
现在打开irb(或pry),开始玩哈希值吧
谢谢你的阅读 🙂