2012-07-15 7 views
21

रूबी है 5 चर स्कोप:अंतर माणिक में scopes

  1. स्थानीय चर: ये सामान्य चर, उदाहरण के x = 25, y = gaurish जहां x और y स्थानीय चर रहे हैं।
  2. इंस्टेंस वैरिएबल: इन्हें वास्तविक चर नाम के नीचे @ प्रतीक के साथ दर्शाया गया है। मुख्य रूप से कक्षाओं के साथ प्रयोग किया जाता है, ताकि कक्षा के प्रत्येक उदाहरण/वस्तु का एक अलग/अलग मूल्य हो। उदाहरण। @employee.name = 'Alex'
  3. कक्षा चर: चर नाम के सामने @@ प्रतीकों के साथ चिह्नित। क्लास वेरिएबल, मुझे लगता है कि सभी मान/ऑब्जेक्ट्स एक ही मूल्य accos है।
  4. वैश्विक चर: वे $ प्रतीक से शुरू होते हैं और हर जगह तक पहुंच योग्य होते हैं। उदाहरण $LOAD_PATH
  5. कॉन्स्टेंट: पूंजी पत्र से शुरू होना चाहिए लेकिन ALL_CAPS में लिखित सम्मेलन द्वारा शुरू होना चाहिए। हालांकि, यह स्थिर है लेकिन इसका मूल्य स्थिर नहीं है और इसे बदला जा सकता है (रूबी हालांकि चेतावनी फेंक देगा)। तो अर्थ में, यह एक चर की तरह कार्य करता है।

जैसा कि आप देख सकते हैं, उपरोक्त सभी वेरिएबल्स हैं जो कुछ प्रकार के कुछ मूल्य संग्रहीत करते हैं और उनका मूल्य बदला जा सकता है। लेकिन, प्रत्येक गुंजाइश कुछ अलग करता है। परिवर्तनीय क्षेत्रों के 5 अलग-अलग प्रकार होने से मुझे नरक भ्रमित कर दिया जाता है। मुख्य रूप से, मुझे किस मामले में निर्णय लेने में कठिनाई है, मुझे अपने कोड में एक विशेष दायरे का उपयोग करना चाहिए। इसलिए मेरे दिमाग में कुछ सवाल हैं। कृपया उत्तर दें:

  1. मुझे लगता है कि स्थानीय चर और वर्ग चर सभी ऑब्जेक्ट्स/उदाहरणों के लिए समान रहते हैं, उदाहरण चर के विपरीत। तो स्थानीय चर और वर्ग चर के बीच क्या अंतर है?
  2. कक्षा चर के स्थान पर स्थानीय चर का उपयोग किया जा सकता है? या ठीक इसके विपरीत। और यदि हां, तो क्यों, और यदि नहीं, तो क्यों नहीं?
  3. रूबी में वैश्विक चर मुझे PHP में बुराई global $x चर के बारे में याद दिलाता है। क्या रूबी में वैश्विक चर भी बुरा मानते हैं और इसलिए इसका उपयोग नहीं किया जाना चाहिए। या, ऐसे विशिष्ट मामले हैं जहां रूबी में वैश्विक चर का उपयोग करना समझ में आता है?
  4. स्थिरांक स्थिरांक क्यों नहीं हैं और उनके मूल्य को बदलने की अनुमति क्यों देते हैं? परिभाषा के आधार पर निरंतर मूल्य स्थिर होना चाहिए? अन्यथा, हम सिर्फ एक और चर का उपयोग कर सकते हैं और इसके मूल्य को नहीं बदल सकते हैं। क्या वह रूबी में एक कॉन्स्टेंट के बराबर होगा?
  5. कोई भी पृष्ठ/संसाधन/लिंक जो रूबी में 5 अलग-अलग चरणीय क्षेत्रों के बीच अंतर बताता है? मैं संदर्भ के लिए एक आसान रखना पसंद है।
  6. उपयोग के मामले में, मुझे अपने कोड में एक विशेष चरणीय दायरे का उपयोग करना चाहिए। तो कोई भी सभी 5 मामलों को समझाएगा उदाहरण के साथ यह अच्छा होगा, यह भ्रम के लिए मेरा मुख्य कारण है।
  7. जावा में public जैसे एक वास्तविक तथ्य है? में उपयोग-मामलों में सुरक्षित शर्त कौन सा होगी?

पढ़ने के लिए समय और जवाब सवाल

+0

बिंदु एक के लिए, सभी ऑब्जेक्ट्स क्लास स्तरीय चर साझा करते हैं, प्रत्येक व्यक्तिगत ऑब्जेक्ट में स्थानीय चर –

+0

की अपनी प्रतिलिपि होगी यदि प्रत्येक व्यक्तिगत ऑब्जेक्ट में स्थानीय चर की अपनी प्रति होगी, तो स्थानीय चर नहीं है जैसे आवृत्ति चर फिर? – CuriousMind

+1

क्रमबद्ध करें, मुझे लगता है कि आप उन्हें इस तरह देख सकते हैं। किसी ऑब्जेक्ट के उदाहरण के लिए इंस्टेंस वैरिएबल _belong_ और आमतौर पर उस ऑब्जेक्ट के गुण बनाते हैं। उदाहरण के लिए 'व्यक्ति' ऑब्जेक्ट में दो इंस्टेंस वेरिएबल '@ first_name' और '@ last_name' हो सकते हैं, इसमें स्थानीय चर' x' भी हो सकता है लेकिन' x' 'व्यक्ति' ऑब्जेक्ट की स्थिति से असंबंधित नहीं हो सकता है –

उत्तर

10
  1. कक्षा चर, सभी उदाहरणों के लिए ही कर रहे हैं, क्योंकि वे वर्ग चर रहे – वर्ग के साथ जुड़े। सबकुछ एक ही चर का उपयोग करता है, जिसमें प्रत्येक उदाहरण शामिल है।

  2. नहीं स्थानीय चर केवल – स्थानीय हैं। वे किसी फ़ंक्शन के लिए स्थानीय हो सकते हैं, या स्थानीय कक्षा घोषणा पर स्थानीय हो सकते हैं, जो क्लास वेरिएबल होने की तुलना में अलग है। वर्ग की घोषणा समाप्त होने पर कक्षा की घोषणा में स्थानीय क्षेत्र गुंजाइश से बाहर हो जाते हैं।

  3. ऐसा इसलिए है क्योंकि वे बिल्कुल – वैश्विक हैं। वैश्विक राज्य हमेशा बुराई है; यह भाषा या पर्यावरण की संपत्ति नहीं है। उस ने कहा, कुछ वैश्विक राज्य की आवश्यकता हो सकती है – यह वही तरीका है। वैश्विक स्थिति होने पर वैश्विक स्थिति का उपयोग करना समझ में आता है। चाल वैश्विक राज्य ठीक से का उपयोग करना है, जो कभी-कभी एक गैर-मामूली प्रयास होता है।

  4. बस रूबी कैसे है।

  5. क्रिस द्वारा पहले ही दिया जा चुका है।

  6. मैं सोचता हूं यह प्रश्न काफी हद तक आत्म-उत्तरदायी होगा। वैश्विक जब पूरी दुनिया को पहुंच की आवश्यकता होती है। उदाहरण जब यह कक्षा के उदाहरण के लिए विशिष्ट है। स्थानीय जब इसे केवल स्थानीय दायरे में आवश्यक होता है (उदाहरण के लिए, एक विधि, ब्लॉक (ब्लॉक स्कोप के संबंध में 1.8 और 1.9 के बीच नोट अंतर) इत्यादि।) जब परिवर्तनीय को बदलने की आवश्यकता नहीं होती है तो लगातार। एक क्लास वैरिएबल जब ऐसा कुछ होता है जो प्रत्येक इंस्टेंस की ज़रूरत होती है, या यदि क्लास विधि के माध्यम से उजागर होता है, तो कुछ कक्षा के साथ कसकर जुड़ा होता है।

  7. कोई "सबसे अधिक उपयोग-मामला" नहीं है, यह पूरी तरह से इस बात पर निर्भर करता है कि आप चर के साथ क्या कर रहे हैं। और public जावा – में वास्तविक तथ्य नहीं है यह प्रश्न में इकाई पर निर्भर करता है। डिफ़ॉल्ट जावा स्कोप पैकेज-निजी (विधियों, गुण) है। रूबी में उपयोग करने के लिए जो पूरी तरह से उपयोग-मामले पर निर्भर करता है, यह नोट करते हुए कि जावा के साथ, और रूबी में और भी आसानी से, चीजों को बाधित किया जा सकता है।

5

स्थानीय चर लेने के लिए धन्यवाद वे ब्लॉक आप में हैं से जुड़े होते हैं, वर्ग लोगों के बराबर नहीं हैं। किसी भी स्थानीय एक ब्लॉक में घोषित वहाँ इस्तेमाल किया जा सकता। कक्षा चर आपके द्वारा बनाई गई कक्षा संरचना से बंधे हैं। कक्षा को परिभाषित करना स्वयं एक ब्लॉक है, इसलिए आप स्थानीय चरों को समान रूप से एक्सेस करने में सक्षम हो सकते हैं, लेकिन आप पाएंगे कि क्या आप अपनी कक्षा को किसी भिन्न संदर्भ में संदर्भित करते हैं, जिसका आप उल्लेख नहीं कर सकते एक ही फैशन में स्थानीय चर।

दुर्व्यवहार किए जाने पर वैश्विक चर को खराब रूप माना जाता है। ओओपी आपको अपने कार्यक्रमों की संरचना में मदद करनी चाहिए ताकि पूरे कार्यक्रम पर स्थिरांक की आवश्यकता न हो। वास्तव में वैश्विक होने के बारे में सोचें: यदि आप पूरी दुनिया के लिए अपनी स्थिरता के लिए झुकाव नहीं कर सकते हैं, जैसे पीआई के मूल्य की तरह या आप अपनी पत्नी से प्यार करते हैं या नहीं, तो आपको शायद वादे नहीं करना चाहिए।

एक बार जब आप उन्हें लटका लेंगे, तो मुझे एक अच्छा संदर्भ होने के लिए "Ruby Variable Scope" मिल जाएगा।

2

मुझे निम्नलिखित लिंक में रूबी में विभिन्न क्षेत्रों और उनकी दृश्यता के बारे में एक अच्छी और गहन व्याख्या मिली। Scopes and Visibilities with Examples in detail.

इसके अनुसार

Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside. 

Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions. 

Global variable ($a_variable): Available everywhere within your Ruby script. 

Local variable (a_variable): It is available only in the particular method or block in ruby script. 

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

class Item 

    def initialize(item_name, quantity) 

     @item_name = item_name 
     @quantity = quantity 

    end 

    def show 

    puts @item_name 
    puts @quantity 
    supplier = "Acme corp" 
    puts supplier 

    end 
end 

Item.new("tv",1).show 

यहाँ आपूर्तिकर्ता एक स्थानीय चर जो केवल हमारे example.Just में इनिशियलाइज़ विधि और शो विधि में इसे बाहर मुद्रण में आपूर्तिकर्ता चर घोषित करने के लिए कोशिश शो विधि से पहुँचा जा सकता है। यह अपरिभाषित परिवर्तनीय आपूर्तिकर्ता के रूप में एक त्रुटि देगा।

मुझे उम्मीद है कि यह मदद करता है। :)

1

यहाँ इस के लिए मेरे दो सेंट है और C++/जावा/सी # प्रोग्रामर के लिए लिख रहा है:

एक रूबी स्थानीय/$ वैश्विक चर ग की तरह एक सा ++/जावा/सी # के स्थानीय/वैश्विक चर रहा है।

ए रूबी @ इंस्टेंस वैरिएबल यह सी ++/जावा/सी # की सदस्य चर/वर्ग संपत्ति की तरह है जो किसी भी सदस्य फ़ंक्शन/क्लास विधि में पहुंच योग्य हो सकता है। हालांकि रूबी इंस्टेंस न केवल कक्षा में बल्कि रूबी मॉड्यूल पर भी लागू किया जा सकता है।

ए रूबी @@ क्लास वेरिएबल सी ++/जावा के स्थिर सदस्य चर के समान है जो एक ही कक्षा के सभी उदाहरणों के बीच साझा होता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^