2010-08-16 12 views
16

मैं रूबी के लिए नया हूं (पायथन, सी ++ और सी के साथ अनुभवी)। मुझे एक कक्षा बनाने की जरूरत है जिसका उपयोग केवल मॉड्यूल में अन्य वर्गों और विधियों द्वारा किया जाना है। पायथन में, मैं बस इसे __classname कहूंगा। मैं सी ++ में एक खाली टाइपपीफ का उपयोग करूंगा। मैं रूबी में यह कैसे कर सकता हूं (या क्या मैं गलत पेड़ को भड़क रहा हूं और इसे "रूबी रास्ता" नहीं कर रहा हूं?)निजी वर्ग (कक्षा विधि नहीं)?

उत्तर

4

मैंने अब तक रूबी में ऐसी अवधारणा नहीं देखी है, लेकिन मुझे लगता है कि आप इसे अनुकरण कर सकते हैं निजी विधि बनाकर जो स्थानीय चर के रूप में बनाई गई कक्षा को वापस लाएगा (याद रखें कि रूबी में, एक वर्ग किसी अन्य वस्तु की तरह एक वस्तु है, और इसे विधि में तत्काल किया जा सकता है और इसके द्वारा लौटाया जा सकता है)।

बीटीडब्ल्यू, रूबी में भी निजी तरीके अन्य भाषाओं में निजी नहीं हैं - आप हमेशा send विधि का उपयोग करके उन्हें एक्सेस कर सकते हैं। लेकिन ऐसा करने से आपको पता चलता है कि आप क्या कर रहे हैं।

+0

अरे। मुझे लगा कि यह संभव था, लेकिन मुझे आशा थी कि यह हैकिश नहीं होगा ... ओह ठीक है। मान लीजिए मुझे ऐसा करने के लिए एक और रूबी-आश रास्ता मिलेगा। धन्यवाद हालांकि - आपने मेरे प्रश्न का उत्तर दिया। – c4757p

+0

आपको अन्य उत्तरों के लिए इंतजार करना चाहिए, मैं भी गलत हो सकता हूं। बीटीडब्ल्यू, आप निजी कक्षाओं के साथ क्या हासिल करना चाहते हैं? ओह, एक और बात: उदाहरण वर्र्स रूबी में हमेशा _private_ हैं, और उन्हें बेनकाब करने के लिए, आपको एक्सेसर विधियां बनाने की आवश्यकता है, लेकिन कोई भी _hackish_ को नहीं मानता है। :) –

+0

वास्तव में मुझे लगता है कि यह/है/थोड़ा सा हैकिश - यह उन चीजों में से एक है जो मुझे रूबी के बारे में पसंद नहीं है। दूसरा बेवकूफ निहित कार्य कॉल है - मैं वास्तव में चाहता हूं कि मैं प्रतीक या लैम्ब्डा के प्रयोग किए बिना इसे बिना किसी कॉल के नाम से किसी फ़ंक्शन का संदर्भ दे सकूं। मैं एफएफआई का उपयोग कर बाहरी पुस्तकालय के साथ गतिशील रूप से इंटरफेसिंग कर रहा हूं, और मैं एफएफआई सी 'संरचना को उपयोग करने योग्य मॉड्यूल से दूर रखना चाहता था। – c4757p

27

एहसास करने की सबसे महत्वपूर्ण बात यह है कि कक्षा कुछ विशेष नहीं है। यह सिर्फ एक वस्तु है। प्रति सम्मेलन में, कक्षाएं स्थिरांक को सौंपी जाती हैं, लेकिन ऐसा कुछ भी नहीं है जो कहता है कि में होना है।

और चूंकि कक्षाएं किसी अन्य वस्तु की तरह वस्तुएं हैं, इसलिए आप उन्हें निजी तरीके से निजी बनाते हैं जिससे आप कोई अन्य वस्तु निजी बनाते हैं।

यहाँ बढ़ती गोपनीयता के क्रम में, संभावनाओं मैं के बारे में सोच सकते हैं: एक नाम स्थान के अंदर

  1. बस घोंसला उन्हें (अर्थात मॉड्यूल)। रूबी में, आमतौर पर यह उम्मीद की जाती है कि लाइब्रेरी के सभी मॉड्यूल और कक्षाएं लाइब्रेरी (यानी my_awesome_libraryMyAwesomeLibrary) के समान नाम के साथ नामस्थान के अंदर रहती हैं, लेकिन सामान्यतः, उस नामस्थान के नीचे घोंसले की गई सभी चीज़ों को निजी माना जाता है। वास्तव में, Test::Unit::TestCase के अलावा, मैं तीन-स्तर के गहरे नामस्थान के एक उदाहरण के बारे में नहीं सोच सकता जिसे वास्तव में क्लाइंट कोड द्वारा उपयोग किया जाने की उम्मीद है।
  2. 1 जैसा ही है, लेकिन इसे MyAwesomeLibrary::Internal::FfiStruct
  3. 1 या 2 के समान कुछ नाम दें, और इसे :nodoc: RDoc टैग के साथ चिह्नित करें।
  4. 3 के समान, लेकिन यर्ड जैसे अधिक आधुनिक प्रलेखन प्रणाली का उपयोग करें, जो वास्तव में आपको निजी एपीआई को स्पष्ट रूप से चिह्नित करने देता है।
  5. निरंतर की बजाय एक विधि का उपयोग करें। तरीके निजी बनाया जा सकता है। (स्थिरता के लिए, आप एक अपरकेस अक्षर के साथ विधि नाम शुरू कर सकते हैं, इसे स्थिर बनाने के लिए। snake_case सम्मेलन केवल यह है कि: एक सम्मेलन।)
  6. एक आवृत्ति चर का उपयोग करें। वे हमेशा निजी होते हैं। ध्यान दें कि निजी तरीकों और आवृत्ति चर दोनों को प्रतिबिंब का उपयोग करके त्रिभुज रूप से उपयोग किया जा सकता है। sendinstance_variable_get से अधिक व्यापक रूप से उपयोग में प्रतीत होता है, हालांकि, उदाहरण के लिए मैं उदाहरण चर के तरीकों की तुलना में उच्च स्तर की गोपनीयता मानता हूं।
  7. वास्तव में वास्तविक गोपनीयता या encapsulation प्राप्त करने का एकमात्र तरीका स्थानीय चर और बंद का उपयोग कर रहा है, हालांकि। ध्यान दें कि यह आपको रूबी के मॉड्यूल, कक्षा या विधि परिभाषा वाक्यविन्यास का उपयोग करने से रोक सकता है, क्योंकि वे नए स्कोप बनाते हैं। सभी मामलों में जहां आपको कक्षा तक पहुंच की आवश्यकता है, आपको Module.new, Class.new या Module#define_method का उपयोग करने की आवश्यकता है।

पूर्व।:

module MyAwesomeLibrary 
    struct = Class.new(FFI::Struct) do 
    # ... 
    end 

    PublicInterface = Class.new do 
    define_method(:initialize) do |bar| 
     @foo = struct.new(bar) 
    end 
    end 
end 

और हाँ, इस केवल रूबी में सच 100% जानकारी छुपा और कैप्सूलीकरण को प्राप्त करने का तरीका है।

हालांकि, सामान्य रूबी तरीका सामान को निजी रूप से दस्तावेज करना होगा (शायद इसे नामस्थान के स्तर पर दबाएं) और अपने साथी डेवलपर्स पर भरोसा करें। रूबी समुदाय में, कभी-कभी इसे पाइथन नारे के तहत सारांशित किया जाता है "हम सभी वयस्कों की सहमति दे रहे हैं"।

+0

"हम सभी सहमत वयस्क हैं" पाइथन समुदाय से एक नारा है, रूबी समुदाय नहीं। –

+0

मेरा मतलब यह नहीं था कि यह रूबी समुदाय से संबंधित है, केवल इसका उपयोग किया जाता है। लेकिन आप सही हैं, शब्द भ्रामक है। अंग्रेजी सीखने के बीस साल स्पष्ट रूप से अभी भी पर्याप्त नहीं हैं :-) –

+0

महान उत्तर, धन्यवाद! –

10

सीधे this blog post से यह जानकारी लेते हुए, लेकिन बाद में रूबी 1.9.3 आप एक मॉड्यूल private_constant का उपयोग कर के भीतर एक निजी वर्ग बना सकते हैं:

class Person 
    class Secret 
    def to_s 
     "1234vW74X&" 
    end 
    end 
    private_constant :Secret 

    def show_secret 
    Secret.new.to_s 
    end 
end