>  Q&A  >  본문

Ruby 中什么样的 Hash 会相等?

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一样么?

为情所困为情所困2709일 전585

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-24 16:01:46

    1, Hash#== 방식, 두 해시의 키-값 쌍 개수가 같고, 자체 #== 방식에 따라 키-값 쌍이 동일하면 두 해시가 동일합니다

    설명:

    • :one=>1은 키-값 쌍이고, :one는 키인 기호이고, 1은 값인 정수입니다. 즉, Ruby의 기호는 전역적으로 고유합니다. , :one은 하나만 있는데, 당연히 서로 같고, 1은 정수이고, 평등 판단도

    • 매우 직관적입니다. Ruby에서
    • 평가에서 #== 메서드는 의미론적 동일성을 제공하기 위해 하위 클래스에 의해 재정의됩니다. 예를 들어 1==1.0true이지만 #equal?은 재정의가 금지됩니다. 비교 대상은 #object_id, 즉 동일한 대상만 equal입니다. 예를 들어 1.equal? 1.0false입니다. 질문자는 #equal?이라고 말해야 합니다.

    2, Hash#merge 메소드(예: h1.merge h2)는 동일한 키에 대해 h1h2로 덮어씁니다. 즉, new_hash["jim"]은 54입니다. 또는 h2 merge h1의 값을 원합니다. 으아아아 h13,

    과 같이 존재하지 않는 키를 인덱싱할 때 해시가 어떤 값을 반환해야 하는지를 주로 다룹니다. 여기서 Hash.new에서 hash1['not_exist_key']|hash, key|입니다. 호출 객체는 hash입니다. 이 문의 의미는 존재하지 않는 키가 인덱싱되면 빈 배열 hash1이 반환된다는 것입니다. 이를 작성하는 더 간단한 방법은 key입니다. >

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-24 16:01:46

    한 jim은 53이고 다른 jim은 54이므로 예상 및 new_hash는 동일하지 않습니다!

    회신하다
    0
  • 취소회신하다