Computer >> Máy Tính >  >> Lập trình >> Ruby

Sự khác biệt giữa #nil ?, #empty ?, #blank ?, và #present?

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?#empty? và Rails 'ActiveSupport thêm #blank?#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 truetrue đối với bất kỳ điều kiện sai nào (tức là nilfalse ).

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?#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?#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.