ruby hash

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby hash相关的知识,希望对你有一定的参考价值。

使用字面量创建的hash对象,必须包括至少一项,ruby才认为它是hash

a = {} 不对  a = {1:“a”}  对    其中{1:a}  这样写 a表示一个变量

Hash.new 
Hash[]

可以使用中文作为key    

irb(main):012:0> c = {"致谢":1, a:2}
=> {:致谢=>1, :a=>2}
irb(main):013:0> c[:致谢]
=> 1

irb(main):064:0> c.first[0].to_s
=> "致谢"
irb(main):065:0> c.first
=> [:致谢, 1]




key是数字   a = { 1 => 2} 这样建立hash 而不是:



 
Hash

哈希表(也叫散列表)的类.通过哈希表,您可以将一个任意类型的对象同另一个任意类型的对象联系起来.可以使用下列哈希表表达式来生成哈希表.
{a=>b, ... }
通常使用Object#hash方法来计算哈希表的值,而使用Object#eql?方法来判定索引是否相同.
若用作索引的对象的内容发生了变化,且hash方法的返回值也有所不同时,将无法取出哈希表中的值.所以Array、Hash等的实例并不面向索引对象本身. 例如,若将字符串作为索引时,将先拷贝该字符串,然后把拷贝设为只读(freeze),最后将该拷贝用作索引.若想更改索引字符串的内容时,将引发TypeError异常.
超类:

Object
包含的模块:

Enumerable
类方法:

Hash[key,value,...]
Hash[hash]
生成新的哈希表.使用第一种形式时,参数的个数必须是偶数.(奇数位参数是索引,偶数位参数是元素值).
使用第二种形式(将一个哈希表对象指定给参数)时, 将生成并返回一个与指定哈希表相同的全新的哈希表.(生成的哈希表的默认值为nil.)
以下是从数组生成哈希表的方法示例(可能您觉得应该有更直接的方法,但实际上并没有).
由[索引, 值, ...] 型的数组变为哈希表
ary = [1,"a", 2,"b", 3,"c"]
p Hash[*ary]

# => {1=>"a", 2=>"b", 3=>"c"}
由索引和值配对出现的数组变为哈希表
alist = [[1,"a"], [2,"b"], [3,"c"]]
p Hash[*alist.flatten]

#=> {1=>"a", 2=>"b", 3=>"c"}
由索引数组和值数组配对生成哈希表(version 1.7 以后)
keys = [1, 2, 3]
vals = ["a", "b", "c"]
alist = keys.zip(vals)   # 或 alist = [keys,vals].transpose
p Hash[*alist.flatten]

#=> {1=>"a", 2=>"b", 3=>"c"}
虽然索引和值都是数组,但还是无法使用(2)或(3)的方法时,只好老老实实地赋值了
h = Hash.new
alist = [[1,["a"]], [2,["b"]], [3,["c"]]]
alist.each {|k,v|
  h[k] = v
}
p h

#=> {1=>["a"], 2=>["b"], 3=>["c"]}
Hash.new([ifnone])
Hash.new {|hash, key| ...} ((<ruby 1.7 特性>))
生成一个全新的空哈希表.若索引没有对应值时,其默认值为ifnone.您必须谨慎地处理默认值的问题(trap::Hash).
ruby 1.7 特性:若指定了块时,则块的计算值将成为默认值.每当调用无值的哈希表元素时,都会对块进行计算,然后返回其结果.而调用哈希表时的索引将被传递给该块.
# 若没有使用块时, 一旦改变默认值将会
# 影响到其他的值
h = Hash.new("foo")
p h[1]                  # => "foo"
p h[1] << "bar"         # => "foobar"
p h[1]                  # => "foobar"
p h[2]                  # => "foobar"


# 若使用块的话,问题便会迎刃而解
h = Hash.new {|hash, key| hash[key] = "foo"}
p h[1]                  # => "foo"
p h[1] << "bar"         # => "foobar"
p h[1]                  # => "foobar"
p h[2]                  # => "foo"

# 若元素无值时,可以(像fetch一样)抛出异常
h = Hash.new {|hash, key|
                raise(IndexError, "hash[#{key}] has no value")
             }
h[1]
# => hash[1] has no value (IndexError)
方法:

self[key]
返回索引为key的哈希表元素的值.若该索引并未注册,则返回默认值(若未设定则为nil).若想区分该nil到底是默认值还是哈希表元素值时,请使用fetch.
self[key]=value
store(key,value)
将索引为key的元素值设为value.返回value.
clear
清空哈希表的内容. 返回self.
clone
dup
返回一个与receiver内容一致的新哈希表. 对冻结的哈希表进行clone时将返回一个同样的冻结的哈希表.但使用dup时,将返回内容相同但却并未冻结的哈希表.
default
default([key]) ((<ruby 1.7 特性>))
返回哈希表的默认值.
ruby 1.7 特性: 若哈希表是通过块来取得默认值时(请参考Hash.new),可以使用第二种形式. 此时将以self和key作参数来执行块,并返回其结果. key的缺省值为nil.
default=value
将哈希表的默认值设为value.若使用无对应值的索引进行搜索时,将返回该值.
返回value.
default_proc ((<ruby 1.7 特性>))
返回一个Proc对象,该对象负责返回哈希表的默认值.若没有默认的Proc时将返回nil.
h = Hash.new {|h, k| }
p h.default_proc        # => #<Proc:0x0x401a9ff4>

h = Hash.new(1)
p h.default_proc        # => nil
delete(key)
delete(key) {|key| ... }
删除索引key与对应元素之间的关系.返回被删除的值.若没有值与key相对应,则返回nil.
若给出块的话,将在key匹配失败时对块进行计算,然后返回其结果.
reject {|key, value| ... }
拷贝self之后对块进行计算,若计算值为真则删除相应的哈希表元素,最后返回该哈希表.
它与Enumerable#reject基本相同,不同的是它会返回哈希表.
delete_if {|key, value| ... }
reject! {|key, value| ... }
把key和value当做参数来计算块,若计算值为真则删除相应的元素.
通常delete_if返回self. reject!就有所不同,若未删除元素时返回nil,除此之外则返回self.
each {|key, value| ... }
each_pair {|key, value| ... }
以key和value为参数对块进行计算.返回self.
{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}

# => [:a, 1]
     [:b, 2]
ruby 1.8 特性:
each和each_pair的块参数交接方法有所不同.
each:      yield([key, val])
each_pair: yield(key, val)
因此,若只向each_pair的块参数传递了一个变量时,将出现下述警告.详情请参考yield.
{:a=>1, :b=>2}.each_pair {|a| p a }
# => -:1: warning: multiple values for a block parameter (2 for 1)
        from -:1
     [:a, 1]
     -:1: warning: multiple values for a block parameter (2 for 1)
        from -:1
     [:b, 2]
each_key {|key| ... }
以key为参数来计算块.返回self.
each_value {|value| ... }
以value为参数来计算块.返回self.
empty?
若哈希表为空则返回真.
fetch(key[, default])
fetch(key) {|key| ... }
返回与索引key对应的元素的值.若该索引未被注册则分为两种情况: 若给出了参数default的话,就返回它的值;若给出了块时,将返回块的计算值.除此之外将引发IndexError异常.(ruby 1.9 特性:将引发IndexError的子类异常KeyError,而不再是IndexError异常.)
has_key?(key)
include?(key)
key?(key)
member?(key)
若key是哈希表的索引则返回真.
has_value?(value)
value?(value)
若value是哈希表的元素值则返回真.对值进行判断时使用==操作符.
index(val)
返回与val对应的索引.若无法对应时返回nil.
若有若干个对应的索引时,则会随机地返回其中之一.
indexes(key_1, ... , key_n) ((<obsolete>))
indices(key_1, ... , key_n) ((<obsolete>))
以数组的形式返回与参数所指的索引相对应的元素值.
ruby 1.8 特性: 该方法在version 1.8中已被禁用.使用时会出现警告信息.此时,应该使用Hash#values_at.
invert
将元素值和索引互换,返回变换后的哈希表. 请注意:若原哈希表中若干不同的索引对应相同的元素值时,其变换结果将无法预测. 因为该方法原本就不是为这种情况所设计的.
h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
h.invert   #=> {200=>"d", 300=>"y", 0=>"a", 100=>"n"}
keys
返回一个包含所有索引的数组.
length
size
返回哈希表中的元素的个数.
merge(other)
merge(other) {|key, self_val, other_val| ... }
merge!(other)
merge!(other) {|key, self_val, other_val| ... }
ruby 1.8 特性
Hash#merge等同于hash.dup.update.而Hash#merge!则是Hash#update的别名.
当self和other中包含相同索引时将按照下列两种方式来处理: 若带块则调用该块,然后由用户选择使用哪个值;不带块的话则通常使用other的值.
rehash
重新计算索引对应的哈希表值。当与索引对应的哈希表值发生变化时,若不使用该方法来重新计算的话,将无法取出与索引对应的哈希表值。
replace(other)
以other的内容来替换哈希表的内容。返回self。
shift
删除一个哈希表元素后,再以[key,value]数组的形式将其返回。
当哈希表为空时,如果没有默认值default则返回nil,如果有默认值的话就返回默认值(请注意,此时并不是以[key,value]的形式返回该值的)。
h = Hash.new
p h.empty?              # => true
p h[0]                  # => nil
p h.shift               # => nil
p h.default             # => nil
h.each {|v| p v}        # =>
p h.to_a                # => []

h1 = Hash.new("default value")
p h1.empty?             # => true
p h1[0]                 # => "default value"
p h1.shift              # => "default value"
p h1.default            # => "default value"
h1.each {|v| p v}       # =>
p h1.to_a               # => []

# ruby 1.7 特性
h2 = Hash.new {|arg| arg}
p h2.empty?             # => true
p h2[0]                 # => [{}, 0]
p h2.shift              # => [{}, nil]
p h2.default            # => [{}, nil]
h2.each {|v| p v}       # =>
p h2.to_a               # => []
to_a
生成并返回一个数组,数组中的元素也是数组,且由[key,value]构成。
to_hash
返回self。
update(other)
update(other) {|key, self_val, other_val| ... } ((<ruby 1.7 特性>))
合并哈希表的内容。若出现相同索引时,将使用other中对应的元素值。
ruby 1.7 特性: 若给出了块的话,每当遇到相同索引时都会对块进行计算,然后以块的计算值作为该索引的对应值。此时,索引、self[key] 和other[key]将被作为参数传递给该块。
foo = {1 => a, 2 => b, 3 => c}
bar = {1 => A, 2 => B, 3 => C}
p foo.dup.update(bar)                   # => {1=>"A", 2=>"B", 3=>"C"}
p foo.dup.update(bar) {|k,v| v}         # => {1=>"a", 2=>"b", 3=>"c"}
返回self。
values
返回一个包括哈希表中的所有元素值的数组。
values_at(key_1, ... , key_n)
ruby 1.8 特性
返回一个数组,该数组包括与参数所指索引相对应的哈希表元素值。若没有与索引相对应的哈希表元素值时,将使用default的值。与indexes以及indices相同。
h = {1=>"a", 2=>"b", 3=>"c"}
p h.values_at(1,3,4)               # => ["a", "c", nil]

 

以上是关于ruby hash的主要内容,如果未能解决你的问题,请参考以下文章

ruby Ruby Hash Manipulation

ruby Ruby片段

ruby Ruby Hash深度搜索没有获得堆栈大小异常

ruby map_hash_to_hash.rb

ruby hash

Ruby--hash