Menu
CoddyTech

Hash.new với giá trị mặc định

Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 33 trên 56.

Theo mặc định, khi tra cứu một khóa không có trong hash, kết quả trả về là nil:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) thay đổi điều đó. Mỗi khóa (key) không tồn tại sẽ trả về giá trị (value) bạn đã truyền vào:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Đây là cách viết bộ đếm gọn nhất. Bạn không cần kiểm tra if scores[name].nil? trước khi tăng giá trị:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

Quan trọng: Hash.new(0) đặt giá trị mặc định là 0 nhưng không lưu khóa khi bạn đọc khóa đó. Từ điển vẫn rỗng cho đến khi bạn gán giá trị. Vì vậy, khi bạn viết counts[letter] += 1, khóa sẽ được thêm vào cùng với giá trị mới.

challenge icon

Thử thách

Dễ

Đọc danh sách các mục category:amount được phân tách bằng dấu phẩy (ví dụ: food:12,gas:30,food:8,books:25,gas:15). Tạo một hash chứa tổng theo từng danh mục bằng Hash.new(0), sau đó chỉ in ra những danh mục có tổng ít nhất là 20, mỗi danh mục trên một dòng, sắp xếp theo tổng giảm dần:

<category>: <total>

Với dữ liệu đầu vào ví dụ ở trên, đầu ra là:

gas: 45
books: 25
food: 20

Nếu không có danh mục nào đạt đến 20, không in gì cả.

Tự làm thử

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); cộng dồn amount theo từng category;
#       sau đó in ra các category có total >= 20, sắp xếp theo total giảm dần
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng xử lý

Tự luyện tập: Trình biên dịch Ruby online