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 endMethod ที่ดีกว่าคือ 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? | |
|---|---|---|---|---|
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? ขึ้นอยู่กับ 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