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"] # nilHash.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.
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: 20Nế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
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ý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online