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

ทำความเข้าใจ Ruby & Rails: เมื่อไหร่ควรใช้ #nil?, #empty?, #blank?, และ #present?

Ruby และ Rails มี methods หลายตัวที่ใช้ตรวจสอบการมีอยู่ของ value หรือ state ของ object Ruby มี #nil? และ #empty? และ Rails' ActiveSupport เพิ่ม #blank? และ #present? ทั้งหมดทำงานแตกต่างกันและสำคัญที่จะรู้ว่าแต่ละตัว evaluate data อย่างไร เพราะการใช้ method ผิดอาจทำให้เกิด unexpected results

ในบทความนี้ เราจะรีเฟรชความรู้เกี่ยวกับ methods เหล่านี้ เราจะ (re)learn ว่า conditions ไหน pass หรือ fail เมื่อแต่ละ method ถูกใช้ รวมถึง type ของ objects ที่แต่ละ method ใช้ได้ เราจะโยน cheat sheet ที่ handy มาให้ท้ายบทความ!

#nil?

#nil? เป็น Ruby method บน class Object เนื่องจากทุก classes สืบทอดจาก class นี้ #nil? จึงใช้ได้กับ object ใดๆ มันคืน true สำหรับ nil (instance ของ class NilClass) และ false สำหรับสิ่งอื่นๆ ทั้งหมด

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

#empty?

#empty? เป็น method ที่ใช้ได้กับ strings, arrays, hashes และ sets มันคืน true ถ้า instance ของ object มี length เป็นศูนย์

เมื่อใช้กับ strings จะคืน true สำหรับ empty strings

"".empty? => true

โปรดสังเกตว่า whitespace characters ก็ถือเป็น characters ดังนั้นการใช้ #empty? บน string ที่มีแต่ whitespace จะคืน false เพราะฉะนั้นอาจไม่ใช่ method ที่ดีที่สุดสำหรับ validate text ถ้าคุณใช้แค่ method นี้ validate user input คุณอาจประมวลผล input ที่มีแต่ whitespace

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

สำหรับ arrays, hashes และ sets จะคืน true ถ้าไม่มี elements

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

เมื่อ #empty? ถูกใช้กับ nil หรือ class ใดๆ ที่ไม่มี method จะ raise NoMethodError exception ดังนั้นเพื่อใช้ในการ check data คุณต้องวาง checks เพิ่มเติมเพื่อให้โปรแกรมไม่ crash

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

Method ที่ดีกว่าคือ Rails #blank? method ซึ่งเราจะมาดูตอนนี้

#blank?

#blank? เป็น Rails method (ใน ActiveSupport) ทำงานบน object ใดๆ

สำหรับ strings จะคืน true สำหรับ empty strings และ strings ที่มีแต่ whitespace characters

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

สำหรับ arrays, hashes และ sets ทำงานเหมือน #empty? คือคืน true ถ้าไม่มี elements

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

คืน false สำหรับ true และ true สำหรับ falsey conditions ใดๆ (เช่น nil และ false)

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

เห็นได้ว่า ดีกว่าใช้ #blank? แทน #empty? ในการ validate data เพราะมันไม่ก่อให้เกิด NoMethodErrors เมื่อใช้บนบาง objects เนื่องจากมีให้ทุก objects มันก็ไม่ pass สำหรับ strings ที่มีแต่ whitespace

#present?

#present? ก็เป็น Rails method ทำตรงข้ามกับ #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

นี่ก็เป็น method ที่ดีกว่า #empty? สำหรับ validation เหตุผลเดียวกับ #blank?

สรุป

เนื่องจาก naming ของ methods เหล่านี้ tend to confuse นี่คือ cheat sheet ที่ handy สำหรับคุณ bookmark ไว้

#nil?#empty?#blank?#present?
5falseNoMethodErrorfalsetrue
""falsetruetruefalse
" "falsefalsetruefalse
"\t\n"falsefalsetruefalse
[]falsetruetruefalse
["a"]falsefalsefalsetrue
{}falsetruetruefalse
{a: "b"}falsefalsefalsetrue
Set.newfalsetruetruefalse
niltrueNoMethodErrortruefalse
truefalseNoMethodErrorfalsetrue
falsefalseNoMethodErrortruefalse

เหมือนทุกอย่าง การเลือกระหว่าง #nil?, #empty?, #blank? และ #present? ขึ้นอยู่กับ situation สำหรับ check ว่า user มี name เรียกหาหรือไม่ #present? อาจเหมาะสม แต่ #blank? และ #present คืน boolean สำหรับทุก objects ซึ่งอาจซ่อน bugs ใน code โดยไม่ raise error เมื่อ value เป็น wrong type

หวังว่าเรา refresh หน่วยความจำของคุณในการ check values ใน Ruby ได้ ถ้ามีคำถามหรือความคิดเห็น อย่าลังเล drop us a line @AppSignal