가능한 중복 :
Ruby method Array#<< not updating the array in hash
Strange ruby behavior when using Hash.new([])Hash.new ([])는 예상대로 작동하지 않습니다
내가 대단한 Koans을하고 있었고, 내가 가서로 따라 서 나는 큰 문제는 발견하지 못했지만, 나는 이것에 비틀 거리며 그것을 이해할 수 없다 :
def test_default_value_is_the_same_object
hash = Hash.new([])
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one] # But I only put "uno" for this key!
assert_equal ["uno", "dos"], hash[:two] # But I only put "dos" for this key!
assert_equal ["uno", "dos"], hash[:three] # I didn't shove anything for :three!
assert_equal true, hash[:one].object_id == hash[:two].object_id
end
모든 테스트가 끝났습니다 (필자가 올바른 어설 션을 작성하는 데 도움이되는 오류를 보았습니다).
마지막 어설 션은 모두 초기화되지 않았으므로 둘 다 기본값이므로 동일한 값을 가져야합니다.
기본 값이으로 변경된 이유를 알지 못합니다. 그게 무슨 일인지 전혀 모르겠습니다.
IRB에서 해봤 던지/어레이가 나를 미치게 만들었다 고 생각했지만 어쩌면 똑같은 결과가 나옵니다.
나는 처음으로 hash[:one] << "uno"
이 { one: ["uno] }
이 될 hash
을 암시한다고 생각하지만, { }
으로 남습니다.
내가 <<
같은데요하지만 단지 push
호출하고
내가 놓친 걸 말해주십시오 =
기호를 사용할 때 새 키는 추가됩니다.
편집 : 당신이 직접 h
을 수정
h = Hash.new(0)
h[:foo] += 1
작업을 수행 할 때 내가
* * 배열 하나만 있습니다 : 값 ('[]')은 * new 메소드가 호출되기 전에 평가됩니다. 블록을 취하는 "기본 형식"을 시도해보십시오 (블록이 생성되거나 호출 될 때마다 실제 * new * 배열을 생성합니다). 나는 이것이 중복 된 것이라고 확신한다. –
그래, 이것도 몇 번 물어 봤어. :) –
@pst 당신이 정교 할 수 있니? 내가 따르고 있는지 잘 모르겠다. 그래서 SO/Google/Duckduckgo에서 비슷한 질문을 찾지 못했지만 항상 물건을 놓칠 수 있습니다.) –