Ruby 哈希的定义、例子和使用方法

522 阅读5分钟

什么是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? 方法。

这个方法返回一个truefalse 的值。

总结

你已经了解了Ruby散列,一种由键值对组成的有用的数据结构。你还学习了如何通过键访问哈希,以及如何在哈希中存储新数据。

现在打开irb(或pry),开始玩哈希值吧

谢谢你的阅读 🙂