Ruby hashes
Hashes là một kiểu dữ liệu lưu trữ theo dạng tập hợp giống như mảng, nhưng các phần tử không được lưu chỉ số mà lưu theo khóa, tức là các phần tử của bảng băm có 2 thành phần là khóa và giá trị. 1: Khởi tạo hashes Ví dụ 1: Để tạo một đối tượng hashes thì chúng ta có thể dùng phương thức new ...
Hashes là một kiểu dữ liệu lưu trữ theo dạng tập hợp giống như mảng, nhưng các phần tử không được lưu chỉ số mà lưu theo khóa, tức là các phần tử của bảng băm có 2 thành phần là khóa và giá trị.
1: Khởi tạo hashes Ví dụ 1:
Để tạo một đối tượng hashes thì chúng ta có thể dùng phương thức new với lớp Hash.
create_hash1.rb hash = Hash.new hash[1] = "Jane" hash.store(2, "Thomas") puts hash
Trong đoạn code trên chúng ta tạo một hashes từ lớp Hash với phương thức new.
hash[1] = "Jane" hash.store(2, "Thomas")
Để tạo các phần tử trong hashes thì chúng ta có thể dùng toán tử [] với tên khóa bên trong. Ở trên chúng ta dùng khóa là các số nguyên, nhưng nếu muốn chúng ta có thể dùng khóa là các kí tự. Ngoài ra lớp Hash còn có phương thức store để tạo các phần tử của hashestương tự như toán tử [].
puts hash
Phương thức puts sẽ in các phần tử của hashes ra trong cặp dấu {}. Các phần tử của hashes sẽ được in theo dạng <khóa> => <giá trị>.
Output {1=>"Jane", 2=>"Thomas"}
Ví dụ 2:
create_hash2.rb hash = { "de" => "Germany", "sk" => "Slovakia", "hu" => "Hungary", "us" => "United States", "no" => "Norway" } puts hash["de"] puts hash["no"]
Chúng ta có thể tạo nhanh các phần tử của hashes bằng theo cú pháp {<khóa>=><giá trị>}.
hash = { "de" => "Germany", "sk" => "Slovakia", "hu" => "Hungary", "us" => "United States", "no" => "Norway" }
Trong ví dụ này chúng ta tạo các khóa và giá trị là các chuỗi string.
puts hash["de"]
Chúng ta có thể in từng giá trị của từng phần tử nhất định thông qua khóa của chúng với toán tử [].
Output Germany Norway
2: Các thao tác trên hashes Ví dụ 1:
hash_methods1.rb hash = Hash.new hash[1] = "Jane" hash[2] = "Thomas" hash[3] = "Robert" hash[4] = "Julia" hash[5] = "Rebecca" puts "Hash size: #{hash.size}" puts hash.keys.inspect puts hash.values.inspect
Trong ví dụ này chúng ta sử dụng một số phương thức cơ bản của hashes.
puts "Hash size: #{names.size}"
Phương thưc size sẽ trả về số lượng phần tử của hashes.
puts hash.keys.inspect puts hash.values.inspect
Phương thức keys sẽ trả về danh sách các khóa trong khi phương thức values sẽ trả về danh sách các giá trị có trong hashes.
Output Hash size: 5 [1, 2, 3, 4, 5] ["Jane", "Thomas", "Robert", "Julia", "Rebecca"]
Ví dụ 2:
hash_methods2.rb hash = Hash.new hash[1] = "Jane" hash[2] = "Thomas" hash[3] = "Robert" hash[4] = "Julia" hash[5] = "Rebecca" hash2 = hash.dup puts hash.eql? hash2 puts hash.empty? hash.clear puts hash.empty?
Trong ví dụ này chúng ta sử dụng một số phương thức khác của hashes.
hash2 = hash.dup
Phương thức dup sẽ tạo một hashes khác có các phần tử giống như hashes gốc.
puts hash.eql? hash2
Phương thức eql? cho biết 2 bảng băm có các cặp khóa-giá trị giống nhau hay không.
puts hash.empty?
Phương thức empty? cho biết hashes có rỗng hay không, dòng code trên sẽ trả về false.
hash.clear puts hash.empty?
Phương thức clear sẽ xóa toàn bộ hashes, do đó phương thức empty? ở sau sẽ trả về True.
Output true false true
Ví dụ 3:
hash_methods3.rb hash = { :de => "Germany", :sk => "Slovakia", :no => "Norway", :us => "United States" } puts hash.has_key? :de puts hash.include? :no puts hash.key? :me puts hash.member? :sk puts hash.has_value? "Slovakia" puts hash.value? "Germany"
Trong ví dụ này chúng ta kiểm tra sự tồn tại của các phần tử. Ngoài ra ở đây chúng ta sử dụng các đối tượng Symbol để làm khóa vì Symbol dễ dùng hơn và cũng tốn ít bộ nhớ hơn.
puts hash.has_key? :de puts hash.include? :no puts hash.key? :me puts hash.member? :sk
Phương thức has_key?, include?, key? và member? đều kiểm tra xem một khóa nào đó có tồn tại trong bảng băm hay không.
puts hash.has_value? "Slovakia" puts hash.value? "Germany"
Phương thức has_value? và value? cho biết giá trị nào đó có tồn tại trong hashes hay không.
Output true true false true true true
Ví dụ 4:
hash_methods4.rb hash = { 1 => "Germany", 2 => "Norway", 3 => "United Kingdom", 4 => "United States" } puts hash.fetch 1 puts hash[2] puts hash.values_at 1, 2, 3
Trong ví dụ này chúng ta sử dụng các phương thức đọc dữ liệu từ hashes.
puts hash.fetch 1
Phương thức fetch nhận vào khóa và trả về giá trị.
puts hash[2]
Như chúng ta đã biết, toán tử [] sẽ trả về giá trị với khóa được chỉ định.
puts hash.values_at 1, 2, 3
Phương thức values_at sẽ trả về các phần tử có khóa được chỉ định.
Output Germany Norway Germany Norway United Kingdom
3: Duyệt hashes Có rất nhiều cách để duyệt qua từng phần tử trong hashes.
browse_hash.rb hash = { 1 => "Germany", 2 => "Norway", 3 => "United Kingdom", 4 => "United States" } hash.each { |k, v| puts "Key: #{k}, Value: #{v}" } hash.each_key { |key| puts "#{key}" } hash.each_value { |val| puts "#{val}" } hash.each_pair { |k, v| puts "Key: #{k}, Value: #{v}" }
Trong ví dụ này chúng ta sử dụng 4 phương thức khác nhau để duyệt qua hashes.
hash.each { |k, v| puts "Key: #{k}, Value: #{v}" }
Phương thức each sẽ duyệt qua toàn bộ từng phần tử trong hashes, mỗi lần duyệt chúng ta thực thi đoạn lênh bên trong cặp dấu {}. Trong đó |k, v| đại diện cho khóa và giá trị, k và v chỉ là những cái tên thay thế, chúng ta có thể dùng tên bất kì do chúng ta đặt như |key, value|...
hash.each_key { |key| puts "#{key}" }
Tương tự, phương thức each_key sẽ duyệt qua từng phần tử nhưng chỉ lấy khóa chứ không thể lấy được giá trị của từng khóa.
hash.each_value { |val| puts "#{val}" }
Phương thức each_value sẽ duyệt qua từng phần tử và lấy giá trị, không lấy khóa.
hash.each_pair { |k, v| puts "Key: #{k}, Value: #{v}" }
Phương thức each_pair duyệt qua từng phần tử giống hệt như phương thức each.
Output Key: 1, Value: Germany Key: 2, Value: Norway Key: 3, Value: United Kingdom Key: 4, Value: United States Germany Norway United Kingdom United States Key: 1, Value: Germany Key: 2, Value: Norway Key: 3, Value: United Kingdom Key: 4, Value: United States
4: Xóa phần tử trong hashes
delete_hash.rb hash = Hash.new hash[1] = "Jane" hash[2] = "Thomas" hash[3] = "Robert" hash[4] = "Julia" hash[5] = "Rebecca" hash.delete 4 hash.shift puts hash
Lớp Hash có một số phương thức để xóa các phần tử ra khỏi hashes.
hash.delete 4
Phương thức delete sẽ xóa phần tử có khóa được chỉ định.
hash.shift
Phương thức shift sẽ xóa phần tử ở vị trí đầu tiên.
Output {2=>"Thomas", 3=>"Robert", 5=>"Rebecca"}
5: Trộn hashes vào nhau Chúng ta có thể trộn các hashes vào nhau để tạo thành một hashes mới.
mix_hashes.rb hash1 = Hash.new hash1[1] = "Jane" hash1[2] = "Thomas" hash2 = Hash.new hash2[3] = "Robert" hash2[4] = "Julia" hash = hash1.merge hash2 puts hash hash = hash1.update hash2 puts hash
Trong ví dụ này chúng ta sử dụng 2 phương thức là merge và update.
hash = hash1.merge hash2 puts hash
Cả 2 phương thức merge và update sẽ trộn 2 hashes vào nhau để tạo thành một hashes mới.
Output {1=>"Jane", 2=>"Thomas", 3=>"Robert", 4=>"Julia"} {1=>"Jane", 2=>"Thomas", 3=>"Robert", 4=>"Julia"}
link tham khảo: http://zetcode.com/lang/rubytutorial/hashes/