อะไรคือความแตกต่าง? เมื่อใดที่ฉันควรใช้ ทำไมถึงมีหลายคน?
อะไรคือความแตกต่าง? เมื่อใดที่ฉันควรใช้ ทำไมถึงมีหลายคน?
คำตอบ:
kind_of?และis_a?มีความหมายเหมือนกัน
instance_of?จะแตกต่างจากอีกสองที่ว่ามันจะส่งกลับเฉพาะtrueถ้าวัตถุเป็นตัวอย่างของชั้นเรียนที่แน่นอนว่าไม่ใช่คลาสย่อย
ตัวอย่าง:
"hello".is_a? Objectและ"hello".kind_of? Objectการกลับมาtrueเพราะ"hello"เป็นStringและStringเป็น subclass Objectของ"hello".instance_of? Objectfalse@honda.kind_of? Carและ@person.is_a? Administratorรูบี้เกี่ยวกับสุนทรียภาพทั้งหมด ในความเป็นจริงให้สังเกตข้อผิดพลาดทางไวยากรณ์ ... ด้วยการสนับสนุนที่ใช้งานได้คุณสามารถเขียน:) @person.is_an? Administrator... ที่อาจทำให้มันกลายเป็นแกนทับทิมในตอนนี้จริง ๆ แล้ว
kind_of?แต่ไม่is_a??
is_an?ไม่ได้อยู่ใน ruby-1.9.2-p0 @ Claudiu ไม่ เป็นเพียงนามแฝงของis_a? kind_of?ทั้งสองวิธีเรียกใช้ฟังก์ชัน c เดียวกัน, rb_obj_is_kind_of.
kind_of? is_a?
is_an?วิธีActiceSupport นี้อยู่ที่ไหน! มันไม่ได้อยู่ในรุ่น Rails ปัจจุบันและฉันไม่สามารถหาอะไรเลยใน google เกี่ยวกับเรื่องนี้ที่เลิกใช้แล้ว
อะไรคือความแตกต่าง?
จากเอกสาร:
- - ( บูลีน )
instance_of?(class)- ส่งคืน
trueถ้าobjเป็นอินสแตนซ์ของคลาสที่กำหนด
และ:
- - ( บูลีน )
is_a?(class)
- ( บูลีน )kind_of?(class)- ผลตอบแทน
trueถ้าclassเป็นชั้นของobjหรือถ้าclassเป็นหนึ่งใน superclasses ของหรือโมดูลรวมอยู่ในobjobj
หากไม่มีความชัดเจนก็จะดีจะรู้ว่าสิ่งที่ว่าเป็นที่ชัดเจนเพื่อให้เอกสารสามารถปรับปรุง
เมื่อใดที่ฉันควรใช้
ไม่เคย ใช้ polymorphism แทน
ทำไมถึงมีหลายคน?
ฉันไม่เรียกสองคนว่า "หลายคน" มีสองคนเพราะพวกเขาทำสองสิ่งที่แตกต่างกัน
respond_to?มันเป็นทับทิมเหมือนจะถามวัตถุไม่ว่าพวกเขาตอบสนองต่อวิธีการที่คุณต้องการหรือไม่ได้ใช้ สิ่งนี้ทำให้ทั้งอินเตอร์เฟสน้อยที่สุดและการเขียนโปรแกรมโดยไม่รู้ตัว
แน่นอนว่ามันไม่สามารถใช้ได้เสมอไปดังนั้นจึงยังมีความเป็นไปได้ที่จะถามเกี่ยวกับความเข้าใจแบบ "ประเภท" ซึ่งเป็นคลาสหรือคลาสพื้นฐานโดยใช้วิธีการที่คุณถาม
ฉันจะไม่เรียกสองอย่าง ( is_a?และkind_of?เป็นนามแฝงของวิธีการเดียวกัน) แต่ถ้าคุณต้องการดูความเป็นไปได้มากขึ้นให้หันความสนใจไปที่#classวิธีการ:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
is_a?และkind_of?มีอยู่: ฉันคิดว่ามันเป็นส่วนหนึ่งของปรัชญาการออกแบบของรูบี้ Python จะบอกว่าควรจะมีวิธีเดียวเท่านั้นที่จะทำอะไรบางอย่าง; Ruby มักจะมีวิธีการตรงกันดังนั้นคุณสามารถใช้วิธีที่ดีกว่า มันเป็นเรื่องของการตั้งค่า ส่วนหนึ่งอาจเป็นเพราะอิทธิพลของญี่ปุ่น: ฉันบอกว่าพวกเขาจะใช้คำที่แตกต่างกันสำหรับหมายเลขเดียวกันขึ้นอยู่กับประโยคเพื่อให้เสียงดีขึ้น Matz อาจนำความคิดนั้นไปใช้ในการออกแบบภาษาของเขา