hash1 = {:one=>1,:two=>2}
hash2 = {:two=>2,:one=>1}
hash1 == hash2
=> true
assert_equal hash1, hash2
=> true
hash1.object_id == hash2.object_id
=> false
這個情況下hash1和hash2明顯不是同一個物件為什麼可以assert_equal?
hash = { "jim" => 53, "amy" => 20, "dan" => 23 }
new_hash = hash.merge({ "jim" => 54, "jenny" => 26 })
expected = { "jim" => 53, "amy" => 20, "dan" => 23, "jenny" => 26 }
expected == new_hash
=> false
這個情況下為什麼expected和new_hash又不等了?
還有一個,求大神解釋一下:
hash = Hash.new {|hash, key| hash[key] = [] }
這句話是什麼意思?這個語法是怎麼回事?三個hash一樣麼?
伊谢尔伦2017-04-24 16:01:46
1, Hash#==
方法, 当两个哈希有相同数目的键值对, 且键值对根据自身的#==
方法判定相等, 則兩個雜湊相等
說明:
:one=>1
就是键值对, :one
为符号, 为键, 1
为整数, 为值. Ruby中的符号是全局唯一的, 即:one
就只有一个, 自然彼此相等, 1
為整數, 相等判斷也很直觀.
Ruby的判決等中, #==
方法会被子类覆盖, 提供语义的相等, 如1==1.0
为true
. 而#equal?
禁止覆盖, 比较对象的#object_id
, 即只有同一个对象才equal
, 如1.equal? 1.0
为false
. 题主应该说的是#equal?
.
2, Hash#merge
方法, 如h1.merge h2
, 对于相同的键, h1
会被h2
中覆盖. 即new_hash["jim"]
为54. 你可以让h2 merge h1
, 如果你想要h1
的值. 或, 如下
new_hash = hash.merge({"jim"=>54, "jenney"=>26}) {|key, oldval, newval| oldval}
new_hash == expected #=> true
3, Hash.new
主要处理的是, 当索引不存在的键时, 哈希应该返回什么值, 如hash1['not_exist_key']
. 此处, |hash, key|
中, hash
即为hash1
, 即调用对象, key
为'not_exist_key'
. 此语句的意思是, 当索引不存在的键时, 返回空数组[]
, 更简单的写法是hash = Hash.new([])
.