อะไรคือความแตกต่าง? เมื่อใดที่ฉันควรใช้ ทำไมถึงมีหลายคน?
อะไรคือความแตกต่าง? เมื่อใดที่ฉันควรใช้ ทำไมถึงมีหลายคน?
คำตอบ:
kind_of?
และis_a?
มีความหมายเหมือนกัน
instance_of?
จะแตกต่างจากอีกสองที่ว่ามันจะส่งกลับเฉพาะtrue
ถ้าวัตถุเป็นตัวอย่างของชั้นเรียนที่แน่นอนว่าไม่ใช่คลาสย่อย
ตัวอย่าง:
"hello".is_a? Object
และ"hello".kind_of? Object
การกลับมาtrue
เพราะ"hello"
เป็นString
และString
เป็น subclass Object
ของ"hello".instance_of? Object
false
@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 ของหรือโมดูลรวมอยู่ในobj
obj
หากไม่มีความชัดเจนก็จะดีจะรู้ว่าสิ่งที่ว่าเป็นที่ชัดเจนเพื่อให้เอกสารสามารถปรับปรุง
เมื่อใดที่ฉันควรใช้
ไม่เคย ใช้ 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 อาจนำความคิดนั้นไปใช้ในการออกแบบภาษาของเขา