มีสำนวนอะไรมากกว่าต่อไปนี้หรือไม่?
foo.class == String
มีสำนวนอะไรมากกว่าต่อไปนี้หรือไม่?
foo.class == String
คำตอบ:
instance_of?ฉันคิดว่าคุณกำลังมองหา is_a?และkind_of?จะคืนค่าจริงสำหรับอินสแตนซ์จากคลาสที่ได้รับ
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
Stringแต่ยังมีและInteger Floatมันยังใช้ได้กับDecimal? (ล่ามข้อความประเสริฐไฮไลท์ไวยากรณ์ที่แตกต่างกันสำหรับการDecimalที่ทำให้ฉันสงสัย)
วิธีการพิมพ์เป็ดมากขึ้นคือการพูด
foo.respond_to?(:to_str)
to_str บ่งชี้ว่าคลาสของอ็อบเจ็กต์อาจไม่ใช่ผู้สืบทอดที่แท้จริงของ String แต่อ็อบเจ็กต์นั้นมีลักษณะคล้ายสตริงมาก (stringy?)
fooทั้งสองจะเป็นtrue, falseหรือสตริงวานิลลา แต่มันเป็นเรื่องดีที่จะเรียนรู้การแก้ปัญหาทั่วไปมากขึ้น
to_strหรือto_s? ทั้งสองแตกต่างกันเล็กน้อย
คุณทำได้:
foo.instance_of?(String)
และทั่วไปมากขึ้น:
foo.kind_of?(String)
kind_ofทั่วไปมากขึ้น? is_aพวกเขาดูเหมือนจะเป็นความหมายเหมือนกัน:
instance_of? is_a?
foo.instance_of? String
หรือ
foo.kind_of? String
หากคุณสนใจเพียงว่ามันมาจากที่Stringใดที่หนึ่งในห่วงโซ่มรดก
นอกจากคำตอบอื่น ๆ แล้ว Class ยังกำหนดวิธีการ === เพื่อทดสอบว่าออบเจ็กต์เป็นอินสแตนซ์ของคลาสนั้นหรือไม่
ฉันคิดว่าวิธีที่ดีกว่าคือการสร้างวิธีการเพรดิเคต วิธีนี้จะบันทึก "จุดควบคุมจุดเดียว" ของคุณด้วย
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
วิธีการพิมพ์เป็ดมากขึ้น;)
"string".is_a?(String)อะไรผิดปกติกับ ดูเหมือนว่าคุณกำลังคิดค้นล้อใหม่ นอกจากนี้ยังมีclass, instance_of, kind_ofฯลฯ ... ความคิดที่ดีที่จะแพทช์ลิงObjectชั้นไม่พูดถึงมันไม่มีความจำเป็น
pre_check("test".is_string?) ตอนนี้ความต้องการโครงการของคุณจะเปลี่ยนไปและทุก ๆ String ที่มีอักขระสามตัวขึ้นไปจะไม่ถูกกำหนดให้เป็น String อีกต่อไป (ฉันรู้ว่ามันผิดปกติ;)) ตอนนี้คุณสามารถเปลี่ยนวิธีการของคุณเองได้อย่างง่ายดาย
is_a?เป็นจริงส่วนใหญ่เป็นสำนวนที่เหมาะสมกว่าที่จะใช้ (และบ่อยครั้งการตรวจสอบการพิมพ์เป็ดอย่างที่ Andrew Grimm กล่าวถึงนั้นดีกว่า) การเปรียบเทียบชั้นเรียนที่เข้มงวดมักจะเป็นกลิ่นรหัส en.wikipedia.org/wiki/Liskov_substitution_principle