Bảng băm (hash) trong Ruby
Bảng băm (Hash) còn gọi là mảng kết hợp, map, dictionary nó tương tự như mảng đã biết nhưng nó được đánh chỉ mục các phần tử.
Các chỉ số trong bảng băm có thể là giá trị bất kỳ không như mảng chỉ số là các số nguyên. Loại dữ liệu này tiện dụng khi cần lưu dữ liệu một cách tương xứng theo cặp chỉ số, giá trị key/value
Để khai báo tạo ra bảng băm dùng ký hiệu {}
, trong đó liệt kê các cặp key => value
. Để truy cập đến phần tử Hash thì tương tự như mảng, dùng ký hiệu [index]
product = {"name" => "Iphone", "price" => 500, "color" => "white"} puts product["name"] # Iphone
Ví dụ trên các index có kiểu chuỗi, thực tế thì nó có thể là kiểu bất kỳ, kể cả dùng đối tượng mảng làm index.
Một số phương thức với Hash
Phương thức | Diễn giải |
---|---|
hash.delete(key) |
Xóa phần từ có chỉ số key |
hash.key(value) |
Trả về key của value trong hash, nếu không thấy trả về nil |
hash.invert |
Tạo hash mởi bằng cách đảo thứ tự hash gốc |
hash.keys |
Trả về mảng chứa các key |
hash.values |
Trả về mảng chứa các value |
hash.length |
Trả về số phần tử hash |
Giống như mảng, các giá trị trong hash có thể là một hash khác
cars = { bmw: { year:2016, color:"red"}, mercedes: { year:2012, color:"black"}, porsche: { year:2014, color:"white"} } puts cars[:bmw][:color] # outputs "red"
Xem phần dưới để biết về Symbol áp dụng khai báo ở hash cars vừa rồi
Symbol trong Ruby
Các đối tượng Symbol biểu thị tên trong Ruby, một Symbol phát sinh khi bạn viết với cú pháp cố
định dạng :name
(sau ký hiệu này tự phát sinh một symbol :name) hoặc viết
:"string"
(phát sinh symbol :string), ngoài ra còn có một số phương thức để sinh ra các
symbol. Một symbol phát sinh là duy nhất trên toàn bộ ứng dụng (kể các trong hàm, trong lớp ...)
a = :Laptop # a lưu trữ một Symbol, symbol :Laptop phát sinh b = :Laptop # b lưu giữ một Symbol, symbol này chính là đối tượng lưu trong a chứ không phát sinh mới
Khi sử dụng Symbol :Laptop
có thể coi là tên biến Laptop
và giá trị của biến
là Laptop
Symbol sử dụng khá giống với chuỗi, nhưng nên sử dụng symbol nếu cần hiệu quả trong so sánh, lưu trữ bộ nhớ ...
Thường dùng Symbol làm index của mảng
product = {:name => :Iphone, :price => 500, :color => "white"} puts product[:name] # Iphone
Khi làm index cho mảng, thì viết với ký hiệu :
giống json
product = {name:"Iphone", price:500, color:"white"} puts product[:name] # Iphone
Duyệt phần tử - Iterator
Để duyệt qua các phần tử của các mảng, bảng băm có thể dùng each
Ví dụ duyệt qua mảng như sau:
arr = [2, 4, 6] arr.each do |x| puts x end
Ví dụ trên duyệt qua phần tử mảng, mỗi phần tử lấy ra lưu trong biến x khai báo ở
mục |x|
gọi là khối tham số, khối lệnh duyệt qua các phần tử nằm giữa
do
và end
Khối tham số có thể trích xuất key và value
sizes = {svga:800, hd:1366, uhd:3840} sizes.each do |key, value| puts "#{key}=>#{value}" end
Nó cũng cung cấp dạng viết vắn tắt, thay thế do, end bằng {}
sizes = {svga:800, hd:1366, uhd:3840} sizes.each { |key, value| puts "#{key}=>#{value}" }
Đối với chuỗi có thể dùng cách tương tự duyệt qua các ký tự với each_char
Có thể tạo ra số lần lặp bằng times
của một số nguyên.
Ví dụ lặp 10 lần
10.times do puts "Xin chào" end