Ruby 简明教程

Ruby - Hashes

哈希是键值对的集合,如下所示:“员工”⇒“工资”。它类似于数组,不同之处在于,索引通过任意对象类型的键完成,而不是整数索引。

通过键或值遍历哈希时的顺序可能看起来是任意的,并且通常不会按插入顺序排列。如果尝试通过不存在的键访问哈希,则该方法将返回 nil。

Creating Hashes

与数组一样,有许多方法可以创建哈希。你可以使用 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 Built-in Methods

我们需要一个 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 方法(假设 hash 是数组对象) −

Sr.No.

Methods & Description

1

hash == other_hash 根据哈希是否具有相同数量的键值对以及键值对是否与每个哈希中的对应对匹配,测试两个哈希是否相等。

2

hash.[key] 使用一个键从哈希中引用一个值。如果找不到该键,则返回一个默认值。

3

hash.[key] = value 关联键给定的值 key 和值给定的值 value。

4

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

5

hash.default(key = nil) 返回哈希的默认值,如果未设置则为 nil by default=([]) 如果键不在哈希中,则会返回一个默认值。

6

hash.default = obj 为哈希设置一个默认值。

7

hash.default_proc 如果哈希是由块创建的,则返回该块。

8

hash.delete(key) [or] *array.delete(key) {

key

block }*通过键从哈希中删除键值对。如果使用块,则在找不到配对的情况下返回块的结果,比较 delete_if。

9

*hash.delete_if {

key,value

block }*为每个块求值为 true 的配对从哈希中删除键值对。

10

*hash.each {

key,value

block }*迭代哈希,为每个键调用块一次,将键值作为两个元素的数组传递。

11

*hash.each_key {

key

block }*迭代哈希,为每个键调用块一次,将键作为参数传递。

12

*hash.each_key {

key_value_array

block }*迭代哈希,为每个键调用块一次,将键和值作为参数传递。

13

*hash.each_key {

value

block }*迭代哈希,为每个键调用块一次,将值作为参数传递。

14

hash.empty? 测试哈希是否为空(不包含任何键值对),返回 true 或 false。

15

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

key

block }*为给定的键从哈希中返回一个值。如果找不到该键,并且没有其他参数,它会引发 IndexError 异常;如果给定了 default,则返回该值;如果指定了可选块,则返回其结果。

16

hash.has_key?(key) [or] hash.include?(key) [or] hash.key?(key) [or] hash.member?(key) 测试给定的键是否存在于哈希中,返回 true 或 false。

17

hash.has_value?(value) 测试哈希是否包含给定的值。

18

hash.index(value) 为哈希中给定的值返回键,如果没有找到匹配的值,则返回 nil。

19

hash.indexes(keys) 返回一个由给定键的值组成的新数组。将为找不到的键插入默认值。此方法已被弃用。使用 select。

20

hash.indices(keys) 返回包含给定键之一的值的新数组。将会插入没有找到的键的默认值。该方法已被弃用,请使用选择。

21

hash.inspect 返回哈希的漂亮打印字符串版本。

22

hash.invert 创建新哈希,反转哈希中的键和值;也就是说,在新哈希中,哈希中的键变为值,值变为键。

23

hash.keys 使用哈希中的键创建新数组。

24

hash.length 返回哈希的大小或长度,形式为整数。

25

hash.merge(other_hash) [or] *hash.merge(other_hash) {

key, oldval, newval

block }*返回包含哈希和 other_hash 内容的新哈希,使用 other_hash 中的内容覆盖哈希中具有重复键的键值对。

26

hash.merge!(other_hash) [or] *hash.merge!(other_hash) {

key, oldval, newval

block }*与合并相同,但在原处进行更改。

27

hash.rehash 根据每个键的当前值重新构建哈希。如果值自插入后发生了变化,则此方法将重新索引哈希。

28

*hash.reject {

key, value

block }*为该块评估为 true 的每一对创建新哈希。

29

*hash.reject! {

key, value

block }*与拒绝相同,但在原处进行了更改。

30

hash.replace(other_hash) 使用 other_hash 的内容替换哈希的内容。

31

*hash.select {

key, value

block }*返回包含哈希中的键值对的新数组,对于这些键值对,此块会返回 true。

32

hash.shift 从哈希中删除键值对,并将其作为包含两个元素的数组返回。

33

hash.size 返回哈希的大小或长度,形式为整数。

34

hash.sort 将哈希转换为包含键值对数组的二维数组,然后作为数组对其进行排序。

35

hash.store(key, value) 在哈希中存储键值对。

36

hash.to_a 从哈希中创建二维数组。每个键值对都转换为数组,然后所有这些数组都存储在包含数组中。

37

hash.to_hash Returns hash (self).

38

hash.to_s 将哈希转换为数组,然后将该数组转换为字符串。

39

hash.update(other_hash) [or] *hash.update(other_hash) {

key, oldval, newval

block}*返回包含哈希和 other_hash 内容的新哈希,使用 other_hash 中的内容覆盖哈希中具有重复键的键值对。

40

hash.value?(value) 测试哈希表是否包含给定值。

41

hash.values 返回一个包含哈希表所有值的数组。

42

hash.values_at(obj, …​) 返回一个包含哈希表中与给定键关联的值的数组。