Ruby - 哈希

哈希是键值对的集合,如下所示:"employee" = > "salary"。 它类似于数组,除了索引是通过任何对象类型的任意键完成的,而不是整数索引。

通过键或值遍历散列的顺序可能看起来是任意的,并且通常不会在插入顺序中。 如果您尝试使用不存在的键访问散列,该方法将返回 nil


创建哈希

与数组一样,有多种方法可以创建散列。 您可以使用 new 类方法创建一个空哈希 −

months = Hash.new

您还可以使用 new 创建具有默认值的散列,否则只是 nil

months = Hash.new( "month" )

or

months = Hash.new "month"

当您访问具有默认值的哈希中的任何键时,如果该键或值不存在,则访问该哈希将返回默认值 −

#!/usr/bin/ruby

months = Hash.new( "month" )

puts "#{months[0]}"
puts "#{months[72]}"

这将产生以下结果 −

month
month

#!/usr/bin/ruby

H = Hash["a" => 100, "b" => 200]

puts "#{H['a']}"
puts "#{H['b']}"

这将产生以下结果 −

100
200

您可以将任何 Ruby 对象用作键或值,甚至是数组,因此以下示例是有效的 −

[1,"jan"] => "January"

哈希内置方法

我们需要一个 Hash 对象的实例来调用一个 Hash 方法。 如我们所见,以下是创建 Hash 对象实例的方法 −

Hash[[key =>|, value]* ] or

Hash.new [or] Hash.new(obj) [or]
Hash.new { |hash, key| block }

这将返回一个填充了给定对象的新哈希。 现在使用创建的对象,我们可以调用任何可用的实例方法。 例如 −

#!/usr/bin/ruby

$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}

keys = months.keys
puts "#{keys}"

这将产生以下结果 −

["1", "2"]

以下是公共哈希方法(假设 hash 是一个数组对象) −

序号 方法 & 描述
1

hash == other_hash

测试两个哈希是否相等,基于它们是否具有相同数量的键值对,以及键值对是否匹配每个哈希中的对应对。

2

hash.[key]

使用一个键,从散列中引用一个值。 如果未找到键,则返回默认值。

3

hash.[key] = value

value 给出的值与 key 给出的键相关联。

4

hash.clear

从哈希中删除所有键值对。

5

hash.default(key = nil)

返回 hash 的默认值,如果 default= 未设置,则返回 nil。(如果 hash 中不存在键,[] 返回默认值。)

6

hash.default = obj

设置 hash 的默认值。

7

hash.default_proc

如果 hash 是由块创建的,则返回一个块。

8

hash.delete(key) [or]

array.delete(key) { |key| block }

通过 keyhash 中删除一个键值对。 如果使用了块,如果没有找到对,则返回块的结果。 比较 delete_if

9

hash.delete_if { |key,value| block }

对于块评估为 true 的每一对,从 hash 中删除一个键值对。

10

hash.each { |key,value| block }

遍历 hash,为每个键调用一次块,将键值作为二元素数组传递。

11

hash.each_key { |key| block }

遍历 hash,为每个键调用一次块,将 key 作为参数传递。

12

hash.each_key { |key_value_array| block }

遍历 hash,为每个 key 调用一次块,将 keyvalue 作为参数传递。

13

hash.each_key { |value| block }

遍历 hash,为每个 key 调用一次块,将 value 作为参数传递。

14

hash.empty?

测试 hash 是否为空(不包含键值对),返回 truefalse

15

hash.fetch(key [, default] ) [or]

hash.fetch(key) { | key | block }

从给定 keyhash 中返回一个值。 如果找不到 key 并且没有其他参数,则会引发 IndexError 异常; 如果 default 给出,则返回; 如果指定了可选块,则返回其结果。

16

hash.has_key?(key) [or] hash.include?(key) [or]

hash.key?(key) [or] hash.member?(key)

测试给定的 key 是否存在于哈希中,返回 truefalse

17

hash.has_value?(value)

测试 hash 是否包含给定的 value

18

hash.index(value)

返回给定 valuekey,如果没有找到匹配的值,则返回 nil

19

hash.indexes(keys)

返回一个由给定键的值组成的新数组。 将为未找到的键插入默认值。 此方法已弃用。 使用选择。

20

hash.indices(keys)

返回一个由给定键的值组成的新数组。 将为未找到的键插入默认值。 此方法已弃用。 使用选择。

21

hash.inspect

返回哈希的 pretty 打印字符串版本。

22

hash.invert

创建一个新的 hash,将 hash 中的 keysvalues 反转; 也就是说,在新的哈希中,来自 hash 的键成为值,值成为键。

23

hash.keys

使用 hash 中的键创建一个新数组。

24

hash.length

以整数形式返回 hash 的大小或长度。

25

hash.merge(other_hash) [or]

hash.merge(other_hash) { |key, oldval, newval| block }

返回包含 hashother_hash 内容的新哈希,用来自 other_hash 的重复键覆盖哈希中的对。

26

hash.merge!(other_hash) [or]

hash.merge!(other_hash) { |key, oldval, newval| block }

与合并相同,但更改已就地完成。

27

hash.rehash

根据每个 key 的当前值重建 hash。 如果值在插入后发生了变化,则此方法会重新索引 hash

28

hash.reject { |key, value| block }

block 评估为 true 的每一对创建一个新的 hash

29

hash.reject! { |key, value| block }

reject 相同,但进行了适当的更改。

30

hash.replace(other_hash)

hash 的内容替换为 other_hash 的内容。

31

hash.select { |key, value| block }

返回一个由 hash 中的键值对组成的新数组,block 为其返回 true

32

hash.shift

hash 中移除一个键值对,将其作为一个二元素数组返回。

33

hash.size

以整数形式返回 hashsize 或长度。

34

hash.sort

hash 转换为包含键值对数组的二维数组,然后将其作为数组排序。

35

hash.store(key, value)

hash 中存储一个键值对。

36

hash.to_a

从散列创建一个二维数组。 每个键/值对都转换为一个数组,所有这些数组都存储在一个包含数组中。

37

hash.to_hash

返回 hash (self)。

38

hash.to_s

hash 转换为数组,然后将该数组转换为字符串。

39

hash.update(other_hash) [or]

hash.update(other_hash) {|key, oldval, newval| block}

返回包含 hashother_hash 内容的新哈希,用来自 other_hashhash 中的对 >。

40

hash.value?(value)

测试 hash 是否包含给定的 value

41

hash.values

返回一个包含所有 hash 值的新数组。

42

hash.values_at(obj, ...)

返回一个新数组,其中包含 hash 中与给定键关联的值。