Hàm băm Ruby là gì?
Hàm băm là một cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu dưới dạng các cặp khóa-giá trị DUY NHẤT. Không giống như mảng, không có chỉ mục số, bạn truy cập các giá trị băm bằng các khóa.
Ví dụ bao gồm :
- Danh sách tên quốc gia và mã quốc gia tương ứng của họ (như ES ⇾ Spain)
- Một từ điển, nơi mỗi từ đều có danh sách các định nghĩa có thể có
- Tên miền và đó là địa chỉ IP
Sử dụng hàm băm trong các chương trình Ruby của bạn có thể tăng tốc mã của bạn khi được sử dụng trong tình huống thích hợp.
Nói cách khác :
Bạn có dữ liệu (hoặc có thể được chuyển đổi thành) định dạng giống như từ điển, nơi dữ liệu có thể được nhóm theo các khóa và giá trị liên quan.
Cách tạo băm
Được rồi.
Chúng tôi có ý tưởng chung về băm là gì, nhưng làm cách nào để bạn tạo một băm?
Như thế này :
{}
Đó là một hàm băm trống!
Một băm có ba cặp khóa / giá trị trông như thế này :
{ a: 1, b: 2, c: 3 }
Ở đâu a
là một khóa và 1
là giá trị tương ứng cho khóa đó. Lưu ý rằng các cặp khóa-giá trị được phân tách bằng dấu phẩy.
Bây giờ :
Hãy xem cách bạn có thể sử dụng hàm băm trong các dự án Ruby của mình bằng các phương pháp băm phổ biến.
Lưu trữ giá trị trong Ruby Hash
Bạn có thể tạo một hàm băm với một tập hợp các giá trị ban đầu, như chúng ta đã thấy.
Đây là một ví dụ khác :
fruits = { coconut: 1, apple: 2, banana: 3 }
Một tùy chọn khác là thêm các giá trị mới vào một hàm băm hiện có.
Như thế này :
fruits[:orange] = 4
Đây là :orange
làm khóa băm và 4
như giá trị tương ứng của nó.
Tại sao dấu hai chấm trước từ
:orange
khi chúng tôi truy cập một giá trị &sau từorange:
khi chúng ta tạo một hàm băm? Đó là một cú pháp đẹp hơn cho phép bạn tạo mã băm mà không cần tên lửa băm (=>
), là một cách hợp lệ, nhưng cũ hơn để làm điều đó.
Giá trị có thể là bất kỳ đối tượng Ruby nào.
Bao gồm :
- Chuỗi
- Số nguyên &số nổi
- Mảng
Các phím cũng có thể là bất kỳ thứ gì, trừ các ký hiệu (như :banana
) &chuỗi là loại khóa phổ biến nhất mà bạn sẽ tìm thấy.
Hãy nhớ rằng…
Các khóa là duy nhất, chúng tôi chỉ có thể có một :orange
khóa hoặc một :apple
phím.
Khi bạn thêm cùng một khóa hai lần, bạn sẽ thay đổi giá trị của nó.
Cách truy cập giá trị từ băm
Bạn truy cập hàm băm bằng khóa.
Nếu bạn cần truy cập trực tiếp vào các giá trị, thì hàm băm có thể không phải là cấu trúc phù hợp cho dữ liệu của bạn.
Ví dụ :
fruits[:orange] # 4
Đây là toàn bộ điểm của hàm băm, để nhanh chóng tra cứu một mục bằng khóa của nó .
Nếu khóa không tồn tại, bạn sẽ nhận được nil
.
fruits[:peach] # nil
Thay vào đó, bạn có thể sử dụng fetch
, cho phép bạn cung cấp giá trị mặc định.
Ví dụ :
fruits.fetch(:peach, 0)
Nếu bạn sử dụng fetch
không có giá trị mặc định (đối số thứ 2), Ruby sẽ tạo ra một KeyError
ngoại lệ.
Điều đó rất hữu ích vì bạn sẽ biết khóa nào bị thiếu.
Cách hợp nhất hai băm Ruby
Bạn có thể lấy hai hàm băm và hợp nhất chúng lại với nhau thành một hàm băm mới.
Phương pháp nào thực hiện điều này?
Chà, không khó để đoán điều này. Tên của phương pháp là merge
.
Đây là cách sử dụng nó :
defaults = { a: 1, b: 2, c: 3 } preferences = { c: 4 } defaults.merge!(preferences) # {:a=>1, :b=>2, :c=>4}
Lưu ý rằng vì các khóa là duy nhất , các giá trị mới hơn sẽ ghi đè các giá trị cũ hơn.
Bạn có thể sử dụng thông tin này cho các giải pháp thú vị, chẳng hạn như tạo hàm băm "mặc định" mà người dùng có thể ghi đè bằng cách chuyển hàm băm của riêng họ.
Nếu bạn cần kiểm soát nhiều hơn cách các khóa được hợp nhất, bạn có thể vượt qua một khối.
Như thế này :
defaults.merge!(preferences) { |key, old, new| [old, new].max }
Nơi old
là các giá trị đến từ defaults
và new
là các giá trị đến từ preferences
.
Nhiều giá trị cho một khóa
Trong từ điển…
Các từ là duy nhất, nhưng chúng có thể có nhiều giá trị ( định nghĩa ) được liên kết với chúng.
Bạn có thể làm điều này trong Ruby!
Ví dụ :
dictionary = { opportunity: [ "a set of circumstances that makes it possible to do something", "a situation or condition favorable for attainment of a goal" ], creativity: [ "the use of imagination or original ideas to create something new", "the ability to create", "the process where new ideas emerge from combining existing ideas in new ways" ] } dictionary[:creativity][1]
Nơi dictionary[:creativity]
cung cấp cho bạn một mảng &[1]
cung cấp cho bạn phần tử thứ 2 từ mảng đó.
Nói cách khác :
Khóa là một ký hiệu và các giá trị là mảng. Khi bạn truy cập hàm băm, bạn sẽ nhận lại một mảng mà bạn truy cập bình thường, giống như bất kỳ mảng nào khác.
Cách sắp xếp một băm
Bạn có thể sắp xếp các mảng. Nhưng bạn có biết rằng bạn cũng có thể sắp xếp các hàm băm không?
Khi bạn sort
một hàm băm, nó được sắp xếp theo khóa.
Ví dụ :
{ b: 1, a: 2 }.sort # [[:a, 2], [:b, 1]]
Nhưng bạn cũng có thể sắp xếp chúng theo giá trị :
{ c: 3, b: 1, a: 2 }.sort_by(&:last)
Bạn sẽ nhận thấy rằng những gì bạn nhận được từ việc sắp xếp một hàm băm không phải là một hàm băm khác…
Đó là một mảng!
Nhưng bạn có thể chuyển đổi mảng này trở lại thành một hàm băm bằng cách sử dụng to_h
phương pháp.
Nhận tất cả các khóa &giá trị từ một băm
Nếu bạn muốn có danh sách tất cả các khóa băm, thì có một phương pháp cho điều đó!
Đây rồi :
{ apple: 1, banana: 2 }.keys # [:apple, :banana]
Cũng có một phương pháp cung cấp cho bạn một mảng chứa các giá trị :
{ apple: 1, banana: 2 }.values # [1, 2]
Nếu bạn muốn biết liệu một khóa có tồn tại trong một hàm băm hay không, thay vì nhận một mảng trong số chúng, hãy sử dụng khóa key?
phương pháp.
Phương thức này trả về true
hoặc false
giá trị.
Tóm tắt
Bạn đã học về hàm băm của Ruby, một cấu trúc dữ liệu hữu ích bao gồm các cặp khóa-giá trị. Bạn cũng đã học cách truy cập hàm băm theo khóa và cách lưu trữ dữ liệu mới trong hàm băm.
Bây giờ, hãy mở irb (hoặc pry) và bắt đầu chơi với hàm băm!
Cảm ơn vì đã đọc 🙂