2012-02-08 28 views
6

Tôi đang đi qua about_hashes.rb từ RubyKoans. 1 bài tập khiến tôi bối rối:Giá trị băm mặc định trong Ruby (Rubykoans.com -> about_hashes.rb)

def test_default_value 
    hash1 = Hash.new 
    hash1[:one] = 1 

    assert_equal 1, hash1[:one] #ok 
    assert_equal nil, hash1[:two] #ok 

    hash2 = Hash.new("dos") 
    hash2[:one] = 1 

    assert_equal 1, hash2[:one] #ok 
    assert_equal "dos", hash2[:two] #hm? 
    end 

Tôi đoán là Hash.new ("dos") làm "dos" câu trả lời mặc định cho tất cả các khóa không tồn tại. Tôi có đúng không?

Trả lời

9

Vâng, bạn là đúng, trông như có một sai lầm trong công án ruby, hash2[:two] sẽ trở lại "dos"

Hãy xem Hash.new Tài liệu phương pháp

mới → new_hash
mới (obj) → new_hash
mới {| hash, key | block} → new_hash

Trả về băm mới, trống. Nếu băm này sau đó được truy cập bằng khóa không tương ứng với mục nhập băm, giá trị trả về phụ thuộc vào kiểu mới được sử dụng để tạo băm. Trong biểu mẫu đầu tiên, truy cập trả về 0. Nếu obj được chỉ định, đối tượng đơn lẻ này sẽ được sử dụng cho tất cả các giá trị mặc định. Nếu một khối được chỉ định, nó sẽ được gọi với đối tượng băm và khóa và phải trả về giá trị mặc định . Trách nhiệm của khối là lưu trữ giá trị trong giá trị băm nếu được yêu cầu.

Sidenote: Bạn có thể xác nhận sự mong đợi của bạn trong trường hợp này bằng cách chạy mã thực tế hoặc bằng cách thực hiện vài dòng trong irb hoặc pry (Tôi khuyên bạn nên nâng lên).

+0

Tôi đã chỉnh sửa câu hỏi của mình, nó phải là "dos" thay vì không. –

4

Bản gốc của công án là:

def test_default_value 
    hash1 = Hash.new 
    hash1[:one] = 1 

    assert_equal __, hash1[:one] 
    assert_equal __, hash1[:two] 

    hash2 = Hash.new("dos") 
    hash2[:one] = 1 

    assert_equal __, hash2[:one] 
    assert_equal __, hash2[:two] 
end 

Các lỗi không nằm trong công án, nhưng trong sự khẳng định bạn đã hoàn thành:

assert_equal nil, hash2[:two] #hm? 

... nên

assert_equal "dos", hash2[:two] #hm? 
+0

Tôi đã chỉnh sửa câu hỏi của mình, nó phải là "dos" thay vì nil. –

Các vấn đề liên quan