Hash trong ruby
Hash (đôi khi được gọi là các mảng kết hợp, bản đồ hoặc từ điển) tương tự như mảng tuy nhiên mảng được đánh chỉ số mảng bằng các số nguyên thì bạn có thể đánh chỉ số của hash bằng các loại: string, biểu thức, đối tượng..... Khi bạn lưu trữ một giá trị trong hash bạn phải cung cấp 2 đối tượng đó là ...
Hash (đôi khi được gọi là các mảng kết hợp, bản đồ hoặc từ điển) tương tự như mảng tuy nhiên mảng được đánh chỉ số mảng bằng các số nguyên thì bạn có thể đánh chỉ số của hash bằng các loại: string, biểu thức, đối tượng..... Khi bạn lưu trữ một giá trị trong hash bạn phải cung cấp 2 đối tượng đó là khóa (key) và giá trị (value). Ví dụ:
h = {'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine', 12 => 'dodecine'} puts h.length # 4 puts h['dog'] # 'canine' puts h puts h[12]
So sánh với mảng hash có một lợi thế đặc biệt: chúng có thể sử dụng bất kì đối tượng nào như một chỉ số . Hash có giá trị mặc định. Giá trị sẽ trả về nil khi giá trị key không tồn tại trong hash.
Tạo một Hash
Giống với mảng, có nhiều cách khác nhau để tạo ra 1 hash. Bạn có thể tạo một hash rỗng bằng cách:
months = Hash.new
Khi bạn truy cập bất kì key nào trong hash. nếu khóa có giá trị không tồn tại, hash sẽ trả về giá trị mặc định:
months = Hash.new( "month" ) puts "#{months[0]}" puts "#{months[72]}"
kết quả sẽ trả về
month month
Cũng có thể tạo ra 1 hash bằng cách:
books = {} books[:matz] = "The Ruby Language" books[:black] = "The Well-Grounded Rubyist" {:matz=>"The Ruby Language", :black=>"The Well-Grounded Rubyist"}
grades = { "Jane Doe" => 10, "Jim Doe" => 6 } grades => {"Jane Doe"=>10, "Jim Doe"=>6}
Public Class Methods
-Tạo một hash bằng các đối tượng
Hash[ key, value, ... ] → new_hash Hash[ [ [key, value], ... ] ] → new_hash Hash[ object ] → new_hash
ví dụ:
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
-Try_convert(obj) → hash or nil
Covert một object vào một hash. trả về bảng băm đã được chuyển đổi hoặc trả về nil nếu không thể covert
Hash.try_convert({1=>2}) # => {1=>2} Hash.try_convert("1=>2") # => nil
Public Instance Methods
-
hash == other_hash
Kiểm tra xem 2 hash có bằng nhau hay không dựa vào việc nó có cùng cặp key-value phù hợp với cặp tương ứng trong mỗi bảng băm
-
hash[key]
sử dụng key truy cập để lấy value từ hash. Nếu key không tìm thấy thì trả về giá trị mặc định
-
hash < other -> true or false
Kết quả sẽ trả về true nếu hash là tập con của tập khác
h1 = {a:1, b:2} h2 = {a:1, b:2, c:3} h1 < h2 #=> true h2 < h1 #=> false h1 < h1 #=> false
Element Assignment
Giá trị được khởi tạo thông qua các khóa:
h = { "a" => 100, "b" => 200 } h["a"] = 9 h["c"] = 4 h #=> {"a"=>9, "b"=>200, "c"=>4}
assoc(obj) → an_array or nil
Tìm kiếm thông qua hash. trả về 1 cặp key-value hoặc nil nếu không được tìm thấy
h = {"colors" => ["red", "blue", "green"], "letters" => ["a", "b", "c" ]} h.assoc("letters") #=> ["letters", ["a", "b", "c"]] h.assoc("foo") #=> nil
clear → hsh Loại bỏ tất cả các cặp key-value trong hash
h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200} h.clear #=> {}
delete(key) → value
delete(key) {| key | block } → value
Xóa cặp giá trị key-value và trả về giá trị khi giá trị bằng giá trị được so sánh. Nếu key không được tìm thấy, trả về giá trị mặc định.
h = { "a" => 100, "b" => 200 } h.delete("a") #=> 100 h.delete("z") #=> nil h.delete("z") { |el| "#{el} not found" } #=> "z not found"
delete_if {| key, value | block } → hsh
delete_if → an_enumerator
Xóa tất cả các cặp key-value nếu block so sánh bằng true.
h = { "a" => 100, "b" => 200, "c" => 300 } h.delete_if {|key, value| key >= "b" } #=> {"a"=>100}
Truy cập vào hash bằng cách:
each {| key, value | block }
each_pair {| key, value | block }
each → an_enumerator
each_pair → an_enumerator
Ví dụ:
h = { "a" => 100, "b" => 200 } h.each {|key, value| puts "#{key} is #{value}" } a is 100 b is 200
empty? -> true, false
Kết quả sẽ trả về true nếu nó không bao gồm cặp key-value nào
{}.empty? #=> true
has_key?(key) -> true or false
Kết quả sẽ trả về true nếu hash tồn tại 1 giá trị bằng key
h = { "a" => 100, "b" => 200 } h.has_value?(100) #=> true h.has_value?(999) #=> false
include?(key) -> true or false
Kết quả sẽ trả về true nếu tồn tại khóa key trong hash
h = { "a" => 100, "b" => 200 } h.has_key?("a") #=> true h.has_key?("z") #=> false
key(value) -> key
Lấy khóa key thông qua value
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 300 } h.key(200) #=> "b" h.key(300) #=> "c" h.key(999) #=> nil
keys -> arrays
Trả về một array chứa các keys của hash:
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 } h.keys #=> ["a", "b", "c", "d"]
values -> arrays
Trả về 1 array chứa các giá trị của hash
h = { "a" => 100, "b" => 200, "c" => 300 } h.values #=> [100, 200, 300]
has_key?(key)
Kết quả trả về true nếu key tồn tại trong hash. tương tự ta cũng có has_values? value
h = { "a" => 100, "b" => 200 } h.has_key?("a") #=> true h.has_key?("z") #=> false
merge(other_hash) → new_hash
Trả về 1 hash mới bao gồm other_hash. Nếu khóa bị trùng lặp thì giá trị sẽ được xác định trong other_hash
h1 = { "a" => 100, "b" => 200 } h2 = { "b" => 254, "c" => 300 } h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
select {|key, value| block} → a_hash
Trả về 1 hash mới bao gồm các cặp thỏa mãn (block trả về true)
h = { "a" => 100, "b" => 200, "c" => 300 } h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300} h.select {|k,v| v < 200} #=> {"a" => 100}
shift → an array or obj
Loại bỏ cặp key-value đầu tiên trong hash hoặc giá trị mặc định nếu hash rỗng
h = { 1 => "a", 2 => "b", 3 => "c" } h.shift #=> [1, "a"] h #=> {2=>"b", 3=>"c"}
size → fixnum
Trả về số cặp key-value trong hash
h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 } h.length #=> 4 h.delete("a") #=> 200 h.length #=> 3
to_a → array
Chuyển đổi hash sang array:
h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
to_h → hsh or new_hash
to_hash → hsh
Trả về chính nó. Nếu gọi một lớp con của hash, chuyển đổi để nhận một đối tượng hash
Hy vọng bài viết giúp bạn hiểu hơn về hash
Nguồn: http://docs.ruby-lang.org/en/2.0.0/Hash.html