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一样么?
1、
Hash#==
メソッド。2 つのハッシュに同じ数のキーと値のペアがあり、キーと値のペアは独自の#== に従って等しいと判断される場合。
メソッドの場合、2 つのハッシュは等しい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
的值. 或者, 如下3,
説明:🎜Hash.new
主要处理的是, 当索引不存在的键时, 哈希应该返回什么值, 如hash1['not_exist_key']
. 此处,|hash, key|
中,hash
即为hash1
, 即调用对象,key
为'not_exist_key'
. 此语句的意思是, 当索引不存在的键时, 返回空数组[]
, 更简单的写法是hash = Hash.new([])
:one=>1
はキーと値のペア、:one
はシンボルとキー、1
はRuby のシンボルはグローバルに一意です。つまり、:one
は 1 つだけあり、それらは当然ながら互いに等しくなります。整数であり、等しいかどうかの判断も非常に直感的です。🎜#==
メソッドはサブクラスによってオーバーライドされ、true1==1.0
などの意味上の同等性を提供します。 /code> と#equal?
は、オブジェクトの#object_id
を上書きして比較することを禁止します。つまり、同じオブジェクトのみがequal
となります。1 .equal? 1.0
はfalse
のようになります。質問者は#equal?
と言う必要があります。🎜h1.merge h2
などのHash#merge
メソッド、同じキーの場合、h1
はh2 に置き換えられます。
> カバレッジ。つまり、new_hash["jim"]
は 54 です。h1 の値が必要な場合は、
または、次のようにします。 リーリー 🎜3、h2 merge h1
を使用できます。Hash.new
は主に、hash1['not_exist_key']
などの存在しないキーにインデックスを付けるときにハッシュが返す値を扱います。 code>|hash, key|、hash
は呼び出し元オブジェクトであるhash1
、key
はです。 not_exist_key'
。このステートメントの意味は、存在しないキーにインデックスが付けられた場合、空の配列[]
が返されるということです。これを記述する簡単な方法はhash です。 = Hash.new([ ])
.🎜expected と new_hash は等しくありません。一方のジムは 53、もう一方のジムは 54 であるためです。