哈希是一组键值对,如下所示:"employee"=> "薪水".它类似于一个数组,除了索引是通过任何对象类型的任意键完成的,而不是整数索引.
您通过键或值遍历散列的顺序可能似乎是任意的,通常不会在插入顺序中.如果您尝试使用不存在的密钥访问哈希,则该方法将返回 nil .
创建哈希
与数组一样,有多种方法可以创建哈希.您可以使用 new 类方法创建空哈希 :
months = Hash.new
您还可以使用 new 创建一个默认值的哈希值,否则只需 nil :
months = Hash.new( "month" )ormonths = Hash.new "month"
当您访问具有默认值的哈希中的任何键时,如果键或值不存在,则访问哈希将返回默认值 :
#!/usr/bin/rubymonths = Hash.new( "month" )puts "#{months[0]}"puts "#{months[72]}"
这将产生以下结果 :
monthmonth
#!/usr/bin/rubyH = Hash["a" => 100, "b" => 200]puts "#{H['a']}"puts "#{H['b']}"
这将产生以下结果 :
100200
您可以使用任何Ruby对象作为键或值,甚至是数组,因此以下示例是有效的1 :
[1,"jan"] => "January"
哈希内置方法
我们需要有一个哈希对象实例来调用哈希方法.正如我们所看到的,以下是创建Hash对象的实例的方法 :
Hash[[key =>|, value]* ] orHash.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.keysputs "#{keys}"
这将产生以下结果 :
["1", "2"]
以下是公共哈希方法(假设哈希是一个数组对象) :
Sr.No. | 方法&说明 |
---|---|
1 | hash == other_hash 根据两个哈希值是否具有相同数量的键值对以及键值对是否与相应的值匹配来测试两个哈希值是否相等在每个哈希中配对. |
2 | hash.[key] 使用键引用哈希值.如果找不到该键,则返回默认值. |
3 | hash.[key] = value 关联 value 给出的值使用键给出的键. |
4 | hash.clear 从哈希中删除所有键值对. |
5 | hash.default (key = nil) 返回 hash 的默认值,如果未按默认值设置则为nil =. ([]如果哈希中不存在该键,则返回默认值.) |
6 | hash.default = obj 设定默认值哈希的值. |
7 | hash.default_proc 如果哈希是由块创建的,则返回一个块. |
8 |
hash.delete(key) [or] array.delete(key) { |key| block } 通过 key 从 hash 中删除键值对.如果使用块,则返回块的结果(如果未找到对).比较 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 |阻止} 迭代哈希,为每个键调用一次块,传递键和 value 作为参数. |
13 | hash.each_key {| value | block} 迭代哈希,为每个键调用一次块,传递值作为参数. |
14 | hash.empty? 测试hash是否为空(不包含键值对),返回 true 或 false . |
15 |
hash.fetch(key [, default] ) [or] hash.fetch(key) { | key | block } 返回给定键的 hash 的值.如果找不到键,并且没有其他参数,则会引发 IndexError 异常;如果给出默认,则返回;如果指定了可选块,则返回其结果. |
16 | hash.has_key?(key) [or] hash.include?(key) [or] hash.key?(key) [or] hash.member?(key) 测试给定的键是否存在于hash,返回 true 或 false . |
17 | hash.has_value?(value) 测试hash是否包含给定的值. |
18 | hash.index(value) 返回给定键如果没有找到匹配的值,则使用哈希值 . |
19 | hash.indexes(keys) 返回a由给定键的值组成的新数组.将为未找到的键插入默认值.不推荐使用此方法.使用选择. |
20 | hash.indices(keys) 返回一个由给定键的值组成的新数组.将为未找到的键插入默认值.不推荐使用此方法.使用选择. |
21 | hash.inspect 返回一个漂亮的打印字符串版本的哈希. |
22 | hash.invert 创建一个新的哈希,从哈希中反转键和值;也就是说,在新的哈希中,来自 hash 的键变为值,值变为键. |
23 | hash.keys 创建一个新的来自哈希的键的数组. |
24 | hash.length 返回 hash 的大小或长度整数. |
25 |
hash.merge(other_hash) [or] hash.merge(other_hash) { |key, oldval, newval| block } 返回包含 hash 和 other_hash 内容的新哈希,用重复键覆盖哈希对来自 other_hash 的那些. |
26 |
hash.merge!(other_hash) [or] hash.merge!(other_hash) { |key, oldval, newval| block } 与合并相同,但更改已完成. |
27 | hash.rehash 重建 hash 基于每个键的当前值.如果值自插入后已更改,则此方法重新索引哈希. |
28 | hash.reject { |key, value| block } 为块评估为 true 的每一对创建一个新的哈希 |
29 | hash.reject! { |key, value| block } 与拒绝相同,但进行了更改. |
30 | hash.replace(other_hash) 用 other_hash 的内容替换 hash 的内容. |
31 | hash.select {| key,value | block } 返回一个新数组,该数组由 hash 的键值对组成,其中块返回 true . |
32 | hash.shift 从 hash 中删除一个键值对,将其返回为两个 - 元素数组. |
33 | hash.size 以整数形式返回 size 或 hash 的长度. |
34 | hash.sort 将 hash 转换为包含键值对数组的二维数组,然后将其排序为数组. |
35 | hash.store(key, value) 在哈希中存储键值对. |
36 | hash.to_a 从哈希创建一个二维数组.每个键/值对都转换为一个数组,所有这些数组都存储在一个包含的数组中. |
37 | hash.to_hash 返回哈希(self). |
38 | hash.to_s 将 hash 转换为数组,然后将该数组转换为字符串. |
39 |
hash.update(other_hash) [or] hash.update(other_hash) {|key, oldval, newval| block} 返回包含 hash 和 other_hash 内容的新哈希,覆盖哈希中的对与 other_hash 中的重复键重复. |
40 | hash.value?(value) 测试是否哈希包含给定的值. |
41 | hash.values 返回包含哈希值的所有值的新数组. |
42 | hash.values_at(obj,...) 返回一个包含 hash 值的新数组与给定的一个或多个键相关联. |