मुझे रूबी में माता-पिता के वर्ग का नाम कैसे मिलता है


85

मान लें कि मेरे पास एक कक्षाएं हैं Aऔर Bजहां Bविरासत में मिली है A। मैं पैरेंट क्लास का नाम कैसे प्रिंट करूंB

class A
end

class B < A
end

कुछ चीजें मैंने आजमाई हैं

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

धन्यवाद :)


4
जब इस तरह अटक हमेशा B.methods.sortirb में प्रयास करें । हो सकता है कि कोई चीज आपको आपके द्वारा खोजे जाने वाले विधि के नाम पर एक सुराग दे।
Ivaylo Strandjev

@IvayloStrandjev मदद नहीं करेगा। देखने के लिए बहुत सारे तरीके हैं। यह समय की बर्बादी है।
आरा

@ सावा सच नहीं। मुझे 30 सेकंड में ले गया। अन्य उपयोगकर्ताओं के लिए काफी तेजी से मेरे लिए, अभी तक काफी तेज है।
Ivaylo Strandjev

8
@ चेक: बहुत सरल! 8.methods.grep(/class/)आपको इस तरह के फ़िल्टरिंग के साथ सॉर्ट करने की भी आवश्यकता नहीं है :)
सर्जियो तुलेंत्सेव

@SergioTulentsev अच्छा है !! यह वास्तव में उपयोगी होगा :)
राहुल तापली

जवाबों:



62

यदि आप पूर्ण पूर्वज स्टैक का प्रयास करना चाहते हैं:

object.class.ancestors

उदाहरण के लिए:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

1
ध्यान रखें कि एक वर्ग में शामिल मॉड्यूल भी शामिल हैं। आप इसके Arrayबाद देख सकते हैं Enumerable, जो माता-पिता नहीं है, लेकिन एरे में शामिल एक मॉड्यूल है । यदि आप केवल कक्षाएं चाहते हैं तो आप कुछ ऐसा कर सकते हैं Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
3limin4t0r

18

किसी ऑब्जेक्ट (त्वरित श्रेणी) को देखते हुए आप मूल कक्षा प्राप्त कर सकते हैं

>> x = B.new
>> x.class.superclass.name
=>"A"

16

मामले में Google किसी को भी यहां लाता है जो रेल में काम कर रहा है, आप इसके बजाय क्या चाहते हैं base_class, जैसा superclassकि ActiveRecord विरासत संरचना के रूप में अच्छी तरह से पार कर जाएगा।

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

आगे भी...

class C < B
end

> C.base_class
=> A

दूसरे शब्दों में, base_classआपको वंशानुक्रम वृक्ष के शीर्ष देता है लेकिन आपके आवेदन के संदर्भ तक सीमित है। हालांकि, जहाँ तक रेल आपके "अनुप्रयोग" का उपयोग करने वाली किसी भी रत्नों का संबंध है, के बारे में उचित चेतावनी है, इसलिए यदि आपके पास एक ऐसा मॉडल है जो एक रत्न में परिभाषित कुछ उप- base_classवर्ग करता है, तो वह रत्न का वर्ग लौटाएगा, आपका नहीं।


8

वह शब्द जो आप ढूंढ रहे हैं superclass। और वास्तव में आप B.superclassप्राप्त करने के लिए कर सकते हैं A। (आप इसे उन B.ancestorsसभी वर्गों और मॉड्यूलों की सूची प्राप्त करने के लिए भी कर सकते हैं - जो कुछ इस तरह से हैं [B, A, Object, Kernel, BasicObject]।)


2

वंशानुक्रम दो वर्गों के बीच का संबंध है। वंशानुक्रम कक्षाओं के बीच माता-पिता के बच्चे के संबंध बनाते हैं। यह कोड के पुन: उपयोग और सार्वजनिक कक्षाओं और इंटरफेस के माध्यम से मूल सॉफ़्टवेयर के स्वतंत्र एक्सटेंशन की अनुमति देने के लिए एक तंत्र है। वंशानुक्रम का लाभ यह है कि श्रेणी के नीचे श्रेणीबद्धता उन उच्चतर की विशेषताओं को प्राप्त करती है, लेकिन अपने स्वयं के विशिष्ट सुविधाओं को भी जोड़ सकती है। ।

रूबी में, एक वर्ग केवल अन्य एकल वर्ग से विरासत में मिल सकता है। (अर्थात एक वर्ग उस वर्ग से विरासत में प्राप्त कर सकता है जो किसी अन्य वर्ग से विरासत में मिलता है जो किसी अन्य वर्ग से विरासत में मिलता है, लेकिन एक एकल वर्ग एक ही बार में कई वर्गों से विरासत में नहीं मिल सकता है)। BasicObject क्लास रूबी में सभी वर्गों का मूल वर्ग है। इसके तरीके इसलिए सभी वस्तुओं के लिए उपलब्ध हैं जब तक कि स्पष्ट रूप से ओवरराइड नहीं किया जाता है।

रूबी ने मिक्सिन का उपयोग करके एक ही बार में एकल वर्ग की विरासत को पार कर लिया।

मैं एक उदाहरण के साथ समझाने की कोशिश करूंगा।

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

आप class_name.superclass.name का उपयोग करके ट्रेस कर सकते हैं और इस प्रक्रिया को तब तक कर सकते हैं जब तक आपको इस पदानुक्रम में BasicOject नहीं मिला। BasicObject सुपर क्लास ओ हर क्लास है। मान लीजिए कि हम वर्ग C पदानुक्रम पेड़ देखना चाहते हैं।

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

आप कक्षा सी की पूरी पदानुक्रम देख सकते हैं। इस दृष्टिकोण का उपयोग कर ध्यान दें कि आपको ऐसे मॉड्यूल नहीं मिलेंगे जो मूल कक्षाओं में शामिल या पूर्वनिर्मित हैं।

मॉड्यूल सहित पूरा पदानुक्रम खोजने के लिए एक और दृष्टिकोण है। रूबी के अनुसार डॉक्टर पूर्वजों । मॉड में शामिल मॉड / प्रीपेन्डेड मॉड्यूल की सूची लौटाता है (मॉड स्वयं सहित)।

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

यहाँ, Mux और कर्नेल मॉड्यूल हैं।

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.