Ruby và Rails có một số phương thức có thể được sử dụng để kiểm tra sự tồn tại của một giá trị hoặc trạng thái của một đối tượng. Ruby cung cấp #nil?
và #empty?
và Rails 'ActiveSupport thêm #blank?
và #present?
. Tất cả những thứ này hoạt động theo cách riêng của chúng và điều quan trọng là phải biết cách mỗi đánh giá dữ liệu vì việc sử dụng sai phương pháp trong mã của bạn có thể gây ra kết quả không mong muốn.
Trong bài viết này, chúng tôi sẽ làm mới kiến thức của bạn về các phương pháp này. Chúng ta sẽ (lại) tìm hiểu những điều kiện nào đạt hoặc không đạt khi mỗi điều kiện được sử dụng cũng như loại đối tượng mà mỗi phương thức có thể được sử dụng. Chúng tôi thậm chí sẽ ném vào một bảng lừa đảo hữu ích ở phần cuối!
#nil?
#nil?
là một phương thức Ruby trên Object
lớp. Vì tất cả các lớp kế thừa từ lớp này, #nil?
có thể được sử dụng trên mọi đối tượng. Nó trả về true
cho nil
(một bản sao của lớp NilClass
) và false cho mọi thứ khác.
nil.nil?
=> true
true.nil?
=> false
5.nil?
=> false
"".nil?
=> false
[].nil?
=> false
#empty?
#empty?
là một phương thức có thể được sử dụng trên chuỗi, mảng, băm và tập hợp. Nó trả về true
nếu phiên bản của đối tượng có độ dài bằng không.
Khi được sử dụng trên chuỗi, nó trả về true
cho các chuỗi trống.
"".empty?
=> true
Lưu ý rằng các ký tự khoảng trắng là các ký tự và do đó sử dụng #empty?
trên một chuỗi chỉ chứa khoảng trắng sẽ trả về false
. Do đó, nó có thể không phải là phương pháp tốt nhất để sử dụng khi xác thực văn bản. Ví dụ:nếu bạn chỉ sử dụng phương pháp này để xác thực thông tin nhập của người dùng, bạn có thể kết thúc quá trình xử lý đầu vào chỉ chứa khoảng trắng.
" ".empty?
=> false
"\t\n".empty?
=> false
Đối với mảng, hàm băm và bộ, nó trả về true
nếu chúng không có phần tử.
[].empty?
=> true
{}.empty?
=> true
require 'set'
Set.new.empty?
=> true
Khi nào #empty?
được sử dụng trên nil
hoặc bất kỳ lớp nào khác không có phương thức, NoMethodError
ngoại lệ sẽ được nâng lên. Vì vậy, để sử dụng nó trong việc kiểm tra dữ liệu của bạn, bạn phải kiểm tra nhiều hơn để đảm bảo chương trình của bạn không bao giờ bị lỗi.
if !my_var.nil? && !my_var.empty?
# make use of my_var
end
Một phương pháp tốt hơn để sử dụng sẽ là Rails #blank?
mà bây giờ chúng ta sẽ xem xét.
#blank?
#blank?
là một phương thức Rails (trong ActiveSupport). Nó hoạt động trên mọi đối tượng.
Đối với các chuỗi, nó sẽ trả về true
cho các chuỗi trống cũng như các chuỗi chỉ chứa các ký tự khoảng trắng.
"".blank?
=> true
" ".blank?
=> true
"\n\t".blank?
=> true
Đối với mảng, băm và tập hợp, nó hoạt động giống như #empty?
, trong đó nó trả về true
nếu chúng không có phần tử.
[].blank?
=> true
{}.blank?
=> true
Set.new.blank?
=> true
[nil].blank?
=> false
["", ""].blank?
=> false
person = {:firstName => "John", :lastName => "Doe"}
person.blank?
=> false
Nó trả về false
cho true
và true
đối với bất kỳ điều kiện sai nào (tức là nil
và false
).
true.blank?
=> false
false.blank?
=> true
nil.blank?
=> true
Như bạn thấy, tốt hơn là sử dụng #blank?
thay vì #empty?
trong việc xác thực dữ liệu vì nó sẽ không gây ra NoMethodErrors
khi được sử dụng trên một số đối tượng vì nó có sẵn cho tất cả các đối tượng. Nó cũng sẽ không chuyển đối với các chuỗi chỉ chứa khoảng trắng.
#present?
#present?
cũng là một phương thức Rails. Nó trái ngược với những gì #blank?
không.
!my_var.blank? == my_var.present?
=> true
Dưới đây là một số ví dụ:
"".present?
=> false
" ".present?
=> false
[].present?
=> false
nil.present?
=> false
true.present?
=> true
false.present?
=> false
{}.present?
=> false
person = {:firstName => "John", :lastName => "Doe"}
person.present?
=> true
5.present?
=> true
Đây cũng là một phương pháp xác thực tốt hơn #empty?
vì những lý do tương tự mà chúng tôi đã đề cập cho #blank?
.
Kết luận
Vì cách đặt tên của các phương pháp này có xu hướng gây nhầm lẫn, đây là một bảng lừa đảo hữu ích để bạn đánh dấu trang.
#nil? | #empty? | #blank? | #present? | |
---|---|---|---|---|
5 | false | NoMethodError | false | true |
"" | false | true | true | false |
"" | false | false | true | false |
"\t\n" | false | false | true | false |
[] | false | true | true | false |
["a"] | false | false | false | true |
{} | false | true | true | false |
{a: "b"} | false | false | false | true |
Set.new | false | true | true | false |
nil | true | NoMethodError | true | false |
true | false | NoMethodError | false | true |
false | false | NoMethodError | true | false |
Như với mọi thứ, sự lựa chọn giữa #nil?
, #empty?
, #blank?
và #present?
tùy theo hoàn cảnh. Để kiểm tra xem người dùng có tên để xưng hô với họ hay không, #present?
có thể là một sự phù hợp, chẳng hạn. Tuy nhiên #blank?
và #present
trả về boolean cho tất cả các đối tượng, điều này có thể ẩn lỗi trong mã bằng cách không tạo ra lỗi khi giá trị không đúng loại.
Chúng tôi hy vọng chúng tôi đã làm mới bộ nhớ của bạn về việc kiểm tra các giá trị trong Ruby. Nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, đừng ngần ngại gửi cho chúng tôi một dòng @AppSignal.