Ruby มี defined?
คำหลักที่ช่วยให้คุณตรวจสอบว่ามีการกำหนดตัวแปรหรือไม่
หากมีตัวแปรอยู่ คุณจะได้ประเภทของตัวแปร :
apple = 1 defined?(apple) # "local-variable"
ถ้าไม่ใช่ คุณจะได้ศูนย์ :
defined?(bacon) # nil
นี่เหมือนกับ typeof
. ของ Javascript โอเปอเรเตอร์ หากคุณต้องการทราบคลาสของวัตถุให้ใช้ class
แทนวิธีนี้
จุดที่น่าสนใจที่ควรทราบ:
defined?
เป็น คำหลัก ไม่ใช่ วิธีการdefined?
เป็นหนึ่งในไม่กี่สิ่งใน Ruby ที่ลงท้ายด้วยเครื่องหมายคำถาม แต่ไม่เป็นไปตามแบบแผนปกติเพื่อส่งคืนtrue
หรือfalse
defined?
สามารถบอกความแตกต่างระหว่างค่าศูนย์และตัวแปรที่ไม่เคยมีการตั้งค่ามาก่อนได้
คุณลักษณะพิเศษเหล่านี้ทำให้คีย์เวิร์ดนี้น่าเรียนรู้
วิธีที่ดีกว่าในการตรวจสอบตัวแปรที่กำหนด
คีย์เวิร์ดนี้มีประโยชน์แต่มีปัญหาบางอย่าง
ทำไม?
เนื่องจากมีความสำคัญน้อยกว่า .
หากคุณทำสิ่งนี้:
defined? orange && orange.size
ผลลัพธ์คือ “การแสดงออก”
เพราะ orange && orange.size
ถูกตีความว่าเป็นอาร์กิวเมนต์ defined?
.
วิธีที่ถูกต้องในการทำเช่นนี้คือ:
defined?(orange) && orange.size
Ruby มีวิธีอื่นในการตรวจสอบว่ามีการกำหนดตัวแปรหรือไม่
สำหรับตัวแปรท้องถิ่น :
local_variables.include?(:orange)
สำหรับตัวแปรอินสแตนซ์ :
instance_variable_defined?("@food")
แต่คุณไม่ต้องการใช้สิ่งนั้น
ใน 99% ของกรณีนี้ หากตัวแปรในเครื่องหายไป แสดงว่าคุณพิมพ์ผิดหรือมีคนลืมประกาศตัวแปรนั้น
แล้วตัวแปรอินสแตนซ์ล่ะ
ตัวแปรอินสแตนซ์ที่ไม่ได้กำหนดจะ nil
. เสมอ ดังนั้นคุณต้องการตรวจสอบสิ่งนั้น
ลองใช้ “ตัวดำเนินการเนวิเกเตอร์ที่ปลอดภัย” (Ruby 2.3+) ซึ่งจะเรียกใช้เมธอดเฉพาะในกรณีที่ตัวแปรไม่ใช่ nil
.
นี่คือตัวอย่าง :
if @user&.country == "Spain" # ... end
สิ่งนี้เทียบเท่ากับ :
if @user && @user.country == "Spain" # ... end
สิ่งเหล่านี้ไม่เป็นสากลเหมือนที่defined?
คำหลัก แต่คาดเดาได้มากกว่า &มีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลง
ตรวจสอบว่ามีการกำหนดวิธีการหรือไม่
คุณสามารถใช้ defined?
เพื่อตรวจสอบว่ามีการกำหนดวิธีการหรือไม่ แต่ก็ไม่เป็นประโยชน์
ตัวอย่าง :
defined?(puts) # "method"
เนื่องจากเป็นคีย์เวิร์ด ไม่ใช่เมธอด คุณจึงใช้กับออบเจกต์ไม่ได้
นี่คือสิ่งที่ฉันหมายถึง :
[].defined?(:size) # undefined method `defined?' for []:Array
คุณกำลังมองหา respond_to?
วิธีการ
วิธีใช้งาน :
[].respond_to?(:size) # true [].respond_to?(:orange) # false
ตรวจสอบว่ามีคลาสอยู่หรือไม่
ตัวอย่าง :
defined?(Object) # "constant" defined?(A) # nil
ตัวเลือกที่ดีกว่าคือการใช้ const_defined?
วิธีการ
ถูกใจสิ่งนี้ :
Object.const_defined?(:String) # true Object.const_defined?(:A) # false
สรุป
เสร็จแล้ว คุณได้เรียนรู้วิธีง่ายๆ ในการตรวจสอบว่ามีตัวแปร คลาส หรือเมธอดที่กำหนดหรือไม่
เมื่อทำงานกับตัวแปร สิ่งที่คุณต้องการส่วนใหญ่คือการตรวจสอบ nil
แทนที่จะกำหนดตัวแปรหรือไม่ หรือดีกว่านั้น ให้แปลงตัวแปรเป็นคลาสที่รู้จักโดยใช้วิธีการแปลง
ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์! หากคุณได้โปรด แชร์ เพื่อให้ผู้คนได้เพลิดเพลินมากขึ้น