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 มาหาเรา