Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ความแตกต่างระหว่าง #nil?, #empty?, #blank? และ #present?

Ruby and Rails มีหลายวิธีที่ใช้ตรวจสอบการมีอยู่ของค่าหรือสถานะของวัตถุ Ruby ให้ #nil? และ #empty? และ ActiveSupport ของ Rails เพิ่ม #blank? และ #present? . ทั้งหมดนี้ทำงานในแบบของตัวเอง และสิ่งสำคัญคือต้องรู้ว่าแต่ละรายการประเมินข้อมูลอย่างไร เนื่องจากการใช้วิธีการที่ผิดในโค้ดของคุณอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด

ในบทความนี้ เราจะรีเฟรชความรู้ของคุณเกี่ยวกับวิธีการเหล่านี้ เราจะเรียนรู้ (อีกครั้ง) ว่าเงื่อนไขใดที่ผ่านหรือล้มเหลวเมื่อมีการใช้แต่ละเงื่อนไข รวมถึงประเภทของวัตถุที่แต่ละวิธีสามารถใช้ได้ เราจะแจกเอกสารสรุปข้อมูลที่มีประโยชน์ในตอนท้ายด้วย!

#ไม่มี?

#nil? เป็นวิธีการ Ruby บน Object ระดับ. เนื่องจากทุกคลาสสืบทอดมาจากคลาสนี้ #nil? สามารถใช้กับวัตถุใดก็ได้ มันส่งคืน true สำหรับ nil (ตัวอย่างของคลาส NilClass ) และเท็จสำหรับอย่างอื่น

nil.nil?
=> true
 
true.nil?
=> false
 
5.nil?
=> false
 
"".nil?
=> false
 
[].nil?
=> false

#ว่างไหม

#empty? เป็นวิธีการที่สามารถใช้ได้กับสตริง อาร์เรย์ แฮช และเซ็ต มันส่งคืน true หากอินสแตนซ์ของวัตถุมีความยาวเป็นศูนย์

เมื่อใช้กับสตริง จะส่งกลับ true สำหรับสตริงว่าง

"".empty?
=> true

โปรดทราบว่าอักขระช่องว่างคืออักขระ ดังนั้นจึงใช้ #empty? ในสตริงที่มีเพียงช่องว่างจะส่งคืน false . ด้วยเหตุนี้ จึงอาจไม่ใช่วิธีที่ดีที่สุดในการตรวจสอบข้อความ หากคุณใช้วิธีนี้เพื่อตรวจสอบการป้อนข้อมูลของผู้ใช้เท่านั้น คุณอาจสิ้นสุดการประมวลผลอินพุตที่มีเฉพาะช่องว่าง

" ".empty?
=> false
 
"\t\n".empty?
=> false

สำหรับอาร์เรย์ แฮช และเซ็ต จะส่งคืน true หากไม่มีองค์ประกอบ

[].empty?
=> true
 
{}.empty?
=> true
 
require 'set'
Set.new.empty?
=> true

เมื่อ #empty? ใช้กับ nil หรือคลาสอื่นที่ไม่มีเมธอด NoMethodError ข้อยกเว้นจะถูกยกขึ้น ดังนั้นเพื่อใช้ในการตรวจสอบข้อมูลของคุณ คุณต้องทำการตรวจสอบเพิ่มเติมเพื่อให้แน่ใจว่าโปรแกรมของคุณจะไม่ขัดข้อง

if !my_var.nil? && !my_var.empty?
  # make use of my_var
end

วิธีที่ดีกว่าในการใช้คือ Rails #blank? ซึ่งเราจะดูกันต่อไป

#ว่างไหม

#blank? เป็นวิธี Rails (ใน ActiveSupport) มันทำงานบนวัตถุใด ๆ

สำหรับสตริงจะส่งกลับ true สำหรับสตริงว่างและสตริงที่มีอักขระช่องว่างเท่านั้น

"".blank?
=> true
 
" ".blank?
=> true
 
"\n\t".blank?
=> true

สำหรับอาร์เรย์ แฮช และเซ็ต มันทำงานเหมือนกับ #empty? โดยจะส่งคืน true หากไม่มีองค์ประกอบ

[].blank?
=> true
 
{}.blank?
=> true
 
Set.new.blank?
=> true
 
[nil].blank?
=> false
 
["", ""].blank?
=> false
 
person = {:firstName => "John", :lastName => "Doe"}
person.blank?
=> false

ส่งคืน false สำหรับ true และ true สำหรับเงื่อนไขเท็จใด ๆ (เช่น nil และ false )

true.blank?
=> false
 
false.blank?
=> true
 
nil.blank?
=> true

อย่างที่คุณเห็น ควรใช้ #blank? แทนที่จะเป็น #empty? ในการตรวจสอบความถูกต้องของข้อมูล เพราะจะไม่ทำให้เกิด NoMethodErrors เมื่อใช้กับวัตถุบางอย่างเนื่องจากสามารถใช้ได้กับวัตถุทั้งหมด นอกจากนี้ยังไม่ส่งผ่านสำหรับสตริงที่มีช่องว่างเท่านั้น

#ของขวัญ?

#present? ยังเป็นวิธีการของ Rails มันทำตรงกันข้ามกับสิ่งที่ #blank? ได้

!my_var.blank? == my_var.present?
=> true

นี่คือตัวอย่างบางส่วน:

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

นี่เป็นวิธีการตรวจสอบที่ดีกว่า #empty? ด้วยเหตุผลเดียวกันกับที่เรากล่าวถึง #blank? .

ในบทสรุป

เนื่องจากการตั้งชื่อของวิธีการเหล่านี้มักจะสร้างความสับสน นี่คือข้อมูลสรุปที่มีประโยชน์สำหรับคุณที่จะคั่นหน้า

#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

เช่นเดียวกับทุกอย่าง ทางเลือกระหว่าง #nil? , #empty? , #blank? และ #present? ขึ้นอยู่กับสถานการณ์ สำหรับตรวจสอบว่าผู้ใช้มีชื่อที่ใช้เรียกหรือไม่ #present? อาจจะเหมาะสมดี เป็นต้น อย่างไรก็ตาม #blank? และ #present คืนค่าบูลีนสำหรับอ็อบเจ็กต์ทั้งหมด ซึ่งอาจซ่อนจุดบกพร่องในโค้ดโดยไม่ทำให้เกิดข้อผิดพลาดเมื่อค่าเป็นประเภทที่ไม่ถูกต้อง

เราหวังว่าเราจะรีเฟรชหน่วยความจำของคุณในการตรวจสอบค่าใน Ruby หากคุณมีคำถามหรือความคิดเห็น อย่าลังเลที่จะส่ง @AppSignal มาหาเรา