มีสำนวนอะไรมากกว่าต่อไปนี้หรือไม่?
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