स्मॉलटाकल में कक्षा चर को कहां परिभाषित किया गया है?

Jan 19 2021

मैं सोच रहा था, अगर मैं एक नए वर्ग चर को परिभाषित करता हूं, उदाहरण के लिए कक्षा के लिए MyClass, क्या परिभाषा में MyClassया अंदर होने वाली है MyClass class? क्या MyClass classनए वर्ग चर के बारे में भी पता है?

जवाब

5 LeandroCaniglia Jan 20 2021 at 00:36

हां, वर्ग चर को वर्ग और मेटाक्लस के साथ साझा किया जाता है। उन्हें सभी उपवर्गों (और उनके मेटाक्लासेस) के साथ भी साझा किया जाता है। एक वर्ग चर को आम तौर पर बड़े वर्ग के दायरे में साझा किए जाने के विचार को बेहतर ढंग से व्यक्त करने के लिए पूंजीकृत किया जाता है। आप कक्षा में वर्ग चर को परिभाषित करते हैं (मेटाक्लस नहीं)।

वर्ग चर को श्रेणी उदाहरण चर के साथ भ्रमित नहीं किया जाना चाहिए, जो कि उदाहरण के रूप में मेटाक्लस स्तर पर परिभाषित चर हैं, अर्थात, वर्ग वस्तु के उदाहरण चर। यह धारणा अपनी सादगी (या इसके कारण) के बावजूद कुछ अस्पष्ट है: उदाहरण चर हमेशा वर्ग में अपने उदाहरणों के आकार (स्लॉट्स) को परिभाषित करने के लिए परिभाषित किए जाते हैं । इस प्रकार, अगर हम इस परिभाषा को मेटाक्लास पर लागू करते हैं, जो कि कक्षा का वर्ग है, तो यहां परिभाषित एक उदाहरण चर इसके उदाहरणों के आकार को परिभाषित करता है, जिनमें से (आमतौर पर) केवल एक है, वर्ग।

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


एक और स्पष्टीकरण

जब हम कहते हैं कि उदाहरण चर को उदाहरणों और उपचिन्हों के बीच साझा किया जाता है, तो हमारा मतलब है कि उनके नाम (और ऑब्जेक्ट स्लॉट की स्मृति में स्थिति); हमें उनके मूल्यों (उक्त स्लॉट्स की सामग्री) से कोई मतलब नहीं है। इस प्रकार, वर्ग के दो उदाहरण Cनाम साझा करेंगे, कहते हैं color, यदि वर्ग आइवर को परिभाषित करता है color, लेकिन प्रत्येक उदाहरण में उनके मूल्य स्वतंत्र होंगे। दूसरे शब्दों में, जो इसे साझा किया जाता है वह नाम है, मूल्य नहीं।

वर्ग चर के साथ जो साझा किया जाता है वह नाम और मूल्य दोनों है। यह वास्तव में Associationवस्तु है, उदाहरण के लिए Theme -> aTheme, क्या साझा किया गया है। परिणाम में, वर्ग चर के मूल्य में कोई भी संशोधन इसके सभी संदर्भों को प्रभावित करता है। वर्ग उदाहरण चर के साथ ऐसा नहीं है क्योंकि वे कुछ भी नहीं हैं लेकिन उदाहरण चर हैं, सिवाय इसके कि वे कक्षा और उसके उपवर्गों को आकार देते हैं, बजाय नियमित रूप से उदाहरणों और उपप्रकारों के।


स्मालटाक चर पर अधिक जानकारी के लिए देखें https://stackoverflow.com/a/42460583/4081336

2 aka.nice Jan 20 2021 at 23:59

लिएंडर के जवाब के पूरक के रूप में, यहाँ मुख्य स्क्वीक कार्यान्वयन विशिष्ट विधि है जो उदाहरण पक्ष (वर्ग) और वर्ग पक्ष (मेटाक्लस) के बीच वर्ग चर के बंटवारे की व्याख्या करती है:

Metaclass>>classPool
    "Answer the dictionary of class variables."

    ^thisClass classPool

जहां thisClassमेटाक्लास का अनूठा उदाहरण है, वह वर्ग ही है ...

अधिकांश स्मॉलटॉक बोलियों में समान कार्यान्वयन खोजने के लिए हालांकि उच्च संभावनाएं हैं।

कंपाइलर पहले वेरिएबल को मेथड / ब्लॉक अस्थायी (मेथड / ब्लॉक पैरामीटर सहित) के रूप में हल करने का प्रयास करेगा, फिर उदाहरण चर, फिर साझा चर।

इस अंतिम चरण में कंपाइलर द्वारा क्लासपूल विधि भेजी जाती है।

एक Leandro ने समझाया, कंपाइलर या तो बाइंडिंग को केवल एक ऑफ़सेट के रूप में हल करता है जो कि उदाहरण के वेरिएबल स्लॉट या मेथड वेरिएबल वेरिएबल के मामले में सीधे बायटेकोड में ट्रांसक्रिप्ट हो जाएगा, या शेयर्ड वेरिएबल केस के लिए एक तरह के एसोसिएशन के रूप में, यह एसोसिएशन आमतौर पर किया जा रहा है CompiledMethod शाब्दिक और प्रभावी ढंग से इस चर से निपटने के सभी तरीकों के बीच साझा किया गया है (सभी विधियाँ एक ही आबंटन ऑब्जेक्ट के लिए जो प्रभावी रूप से साझा की गई है)।

संकलक भाग अधिक विशिष्ट है, स्क्वीक में, यह वह विधि है जिसका उपयोग साझा चर के बंधन को हल करने के लिए किया जाता है:

class>>bindingOf: varName environment: anEnvironment
    "Answer the binding of some variable resolved in the scope of the receiver"
    | aSymbol binding |
    aSymbol := varName asSymbol.

    "First look in local classVar dictionary."
    binding := self classPool bindingOf: aSymbol.
    binding ifNotNil:[^binding].

    "Next look in local shared pools."
    self sharedPools do:[:pool | 
        binding := pool bindingOf: aSymbol.
        binding ifNotNil:[^binding].
    ].

    "Next look into superclass pools"
    superclass ifNotNil: [^ superclass bindingOf: aSymbol environment: anEnvironment].

    "No more superclass... Last look in declared environment."
    ^anEnvironment bindingOf: aSymbol

यह आपको याद दिलाना है कि स्मालटाक का सबसे दिलचस्प हिस्सा यह है कि आप आईडीई के भीतर से कार्यान्वयन में खुदाई कर सकते हैं, स्मॉलटाक अनिवार्य रूप से स्मॉलटाक में लिखा गया है!