Kiểu dữ liệu Hashes trong Ruby: Hiểu từ đơn giản đến phức tạp
Trong bài này ta sẽ tìm hiểu kiểu dữ liệu Hash trong Ruby, đây là một cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu dưới dạng key - value.
Nếu bạn đã từng làm việc với một vài ngôn ngữ khác trước khi mà tìm hiểu Ruby, thì sẽ hiếm thấy một kiểu dữ liệu nào nghe tên là Hash. Mình từng làm việc với một vài ngôn ngữ như PHP, C/C++ hay Java thì chưa từng nghe đến kiểu dữ liệu này bao giờ cho đến khi tiếp xúc với Ruby.
Đây là một kiểu dữ liệu mình thấy khá là phổ biến trong qua trình làm việc với Ruby hay framework chủ đạo của Ruby là Ruby on Rails. À nếu như bạn từng làm việc với Javascript rồi thì kiểu dữ liệu Hash này sẽ có cú pháp giống với kiểu Object
Hash trong Ruby được định nghĩa như sau:
Bài viết này được đăng tại [free tuts .net]
car = {name: "bmw", year: "2013"}
hoặc bạn cũng có thể định nghĩa bằng cú pháp này đều được, cú pháp này thì cũ hơn cú pháp trên nhé, nhìn là biết về độ ngắn gọn rùi
car = {:name => "bmw", :year => "2003"}
1. Vậy tóm lại Hash là gì?
Hash là một cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu dưới dạng key - value
{ a : 1, b: 2, c: 3 }
trong đó với a, b, c được coi là key, còn 1, 2, 3 là value.
Chúng ta cũng có thể gọi Hash như là một mảng kết hợp, bởi cách lưu trữ dữ liệu của chúng không khác gì so với một mảng kết hợp cả. Hash tiện hơn so với mảng đơn thuần đó là thay vì key chỉ được lưu theo chỉ mục thì với Hash chúng ta có thể tùy ý đặt tên cho key của chúng.
Đối với việc định nghĩa một key thì chúng ta có thể khai báo dưới kiểu dữ liệu là String hoặc là Symbol, hoặc là Integer đều được hết
2. Khởi tạo một hash như thế nào
Để khởi tạo một Hash rỗng, chúng ta sử dụng từ khóa new.
car = Hash.new => {} # Để kiểm tra xem đúng là Hash chưa các bạn cứ gọi đến <strong>.class</strong> car.class => Hash
hoặc
book = {} => {} book.class => Hash
để khởi tạo một Hash rỗng.
Khởi tạo Hash rỗng xong rồi thì chúng ta cũng nên biết cách để tạo các giá trị cho Hash chứ nhỉ. Chúng ta có thể khởi tạo giá trị mặc định cho một Hash, khi chúng ta truy cập vào bất cứ key nào trong Hash nếu key đó không tồn tại kết quả sẽ được trả về giá trị mặc định.
car = Hash.new("bmw") => {} car[1] => "bmw" car["abcdef"] => "bmw"
Như các bạn thấy để lấy giá trị trong Hash, bạn gọi tới như một mảng vậy, sử dụng cú pháp hashName['key'].
Nếu muốn khởi tạo cặp key - value cụ thể chúng ta có thể khai báo như sau
car = {} => {} car["name"] = "bmw" // hoặc car[:name] => "bmw" car["year"] = 2013 // hoặc car[:year] => 2013 car => {"name"=>"bmw", "year"=>2013}
3. Missing values
Nếu như gọi tới một key không tồn tại kết quả trả về sẽ là nil.
car["abc"] => nil
4. Một vài thao tác phổ biến khi sử dụng Hash
Để so sánh hai Hash với nhau các đơn giản nhất là cứ sử dụng ==
x = {a: 1, b: 2} => {:a=>1, :b=>2} y = {a: 1, b:2} => {:a=>1, :b=>2} x == y => true
Để nhận giá trị trong Hash sử dụng hash[key]
h = { "a" => 100, "b" => 200 } puts h["a"] #=> 100 puts h["c"] #=> nil
Lấy tất cả các value có trong Hash
puts car => {"name"=>"bmw", "year"=>2013} puts car.values => ["bmw", 2013]
Lấy tất cả key có trong Hash
puts car => {"name"=>"bmw", "year"=>2013} puts car.keys => ["name", "year"]
Xóa tất cả các cặp key-value
tồn tại trong Hash sử dụng clear
car.clear => {}
Kiểm tra một Hash có rỗng hãy không empty?
car.empty? => true
Chuyển kiểu Hash sang kiểu JSON sử dụng to_json. Nhưng trước hết cần phải require thư viện json vào trước thì mới có thể dùng được phương thức này.
require 'json' car.to_json
Xóa một cặp key-value khi biết trước key sử dụng delete, khác với clear là clear sẽ xóa toàn bộ tất cả các căp giá trị bên trong Hash
car.delete(:name) => "bmw" p car => {:year=>"2013"}
Xóa phần tử đầu tiên trong hash sử dụng shift
a= {1=>"Thomas", 2=>"Robert", 3=>"Rebecca"} => {1=>"Thomas", 2=>"Robert", 3=>"Rebecca"} a.shift => [1, "Thomas"] puts a => {2=>"Robert", 3=>"Rebecca"}
Kiểm tra sự tồn tại của một key có trong Hash sử dụng include?
car = {name: "bmw", year: "2013"} => {:name=>"bmw", :year=>"2013"} car.<strong>include</strong>?(:name) => true
Gộp 2 hashes lại với nhau sử dụng merge
a = {1 => "Quang", 2 => "Phu"} => {1=>"Quang", 2=>"Phu"} b = {3 => "Thu", 4 => "Thuy"} => {3=>"Thu", 4=>"Thuy"} a.merge b => {1=>"Quang", 2=>"Phu", 3=>"Thu", 4=>"Thuy"}
5. Kết luận
Trên đây là những khái niệm và những thao tác cơ bản nhất khi sử dụng kiểu dữ liệu Hash trong Ruby. Khi làm việc với những dự án thực tế, việc bạn tiếp xúc và phải thao tác với kiểu dữ liệu này là rất nhiều, vậy nên hãy nắm chắc cho mình những phương thức hữu ích để khi gặp trường hợp thực tế có thể sử dụng.
Ngoài những phương thức mình nêu trên thì còn rất nhiều các phương thức khác để thao tác với Hash như select, map, reject... Thế nhưng minh sẽ tách chúng ra làm một bài khác để có thể nói hết được sức mạnh mà những phương thức kia mang lại.