+7

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à 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

  1. 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

  1. 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

  1. 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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí