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

วิธีตรวจสอบว่าตัวแปรถูกกำหนดใน Ruby . หรือไม่

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 แทนที่จะกำหนดตัวแปรหรือไม่ หรือดีกว่านั้น ให้แปลงตัวแปรเป็นคลาสที่รู้จักโดยใช้วิธีการแปลง

ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์! หากคุณได้โปรด แชร์ เพื่อให้ผู้คนได้เพลิดเพลินมากขึ้น