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 doend

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
Đăng ký theo dõi ủng hộ kênh