2009-07-02 14 views
82

सामान्य रूप से, मैं उस ऑब्जेक्ट का संदर्भ कैसे प्राप्त कर सकता हूं जिसका नाम मेरे पास स्ट्रिंग में है?एक इंस्टेंस वैरिएबल का मान प्राप्त करें जिसका नाम

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

प्रत्येक पैरामीटर एक ऑब्जेक्ट है जिसमें from_s विधि भी है।

define_method(:from_s) do | arg | 
    @ordered_parameter_names.each do | param | 
     instance_eval "field_ref = @#{param}" 
     field_ref.from_s(param) 
    end 
end 

उत्तर

157

इस लक्ष्य को हासिल करने के लिए सबसे मुहावरेदार तरीका है:

some_object.instance_variable_get("@#{name}") 

+ या intern का उपयोग करने की आवश्यकता नहीं है; रुबी इसे ठीक से संभाल लेंगे। हालांकि, अगर आप खुद को किसी अन्य वस्तु में पहुंचते हैं और अपने इवर को खींचते हैं, तो एक अच्छा मौका है कि आपने encapsulation तोड़ दिया है।

यदि आप स्पष्ट रूप से एक ivar तक पहुंचना चाहते हैं, तो करने के लिए सही काम यह एक एक्सेसर बनाना है। निम्नलिखित पर विचार करें:

class Computer 
    def new(cpus) 
    @cpus = cpus 
    end 
end 

इस मामले में, अगर आप Computer.new किया था, आप instance_variable_get उपयोग करने के लिए @cpus पर प्राप्त करने के लिए मजबूर किया जाएगा। लेकिन अगर आप ऐसा कर रहे हैं, तो संभवत: @cpus के लिए सार्वजनिक होने का मतलब है। आपको क्या करना चाहिए:

class Computer 
    attr_reader :cpus 
end 

अब आप Computer.new(4).cpus कर सकते हैं।

ध्यान दें कि आप किसी भी मौजूदा कक्षा को फिर से खोल सकते हैं और एक पाठक में एक निजी ivar बना सकते हैं। चूंकि एक एक्सेसर केवल एक विधि है, आप Computer.new(4).send(var_that_evaluates_to_cpus)

+0

example_variable_get ("@ # {name}") वैरिएबल के मान को वापस नहीं करता है? मुझे वास्तविक वस्तु के संदर्भ की आवश्यकता है। मैंने कई वैरिएबल + ऑर्डर के नामों के साथ एक सरणी रखने के बजाय फिर से लिखना समाप्त कर दिया, मैंने पैरामीटर को सरणी में डाल दिया (डिज़ाइन निर्णय यह था कि प्रत्येक बार सरणी को खोजकर या अनुकूलित करके अनुकूलित करने के लिए चर उनके नामों के साथ एक अतिरिक्त सरणी जिसका उपयोग केवल तभी किया जाएगा जब –

+0

नहीं: instance_variable_get ("@ # {name}") वास्तविक वस्तु देता है। –

+0

स्पष्टता के लिए मृत धागे को उजागर करना। पूरा उदाहरण होगा: वर्ग कंप्यूटर attr_read: CPUs डीईएफ़ नई (सीपीयू) @cpus = CPUs अंत अंत ? –

7

एक उदाहरण चर के नाम से एक उदाहरण चर प्राप्त करने के लिए कार्य करें::

name = "paramName" 
instance_variable_get(("@" + name).intern) 

मैं निम्नलिखित (जो निश्चित रूप से काम नहीं करता है ...) की तरह कुछ करना चाहता हूँ

यह उदाहरण चर के मूल्य वापस आ जाएगी @paramName

+0

गतिशील रूप से कक्षा बनाते समय, मेरे पास आवृत्ति चर नामों की एक सरणी है (मुझे इस सूची की आवश्यकता है क्योंकि मुझे उन्हें एक निश्चित क्रम में संभालने की आवश्यकता है)। इस नाम का उपयोग करके, मैं चर के संदर्भ प्राप्त करना चाहता हूं। –

+1

मेरे पास एक स्ट्रिंग "paramName" है और @paramName –

+1

ठीक के संदर्भ की आवश्यकता है। मैं आपको उन प्रश्नों को ठीक कहने के लिए अपने प्रश्न को संपादित करने की सलाह देता हूं। –

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