2010-05-13 14 views
10

मेरे पास रूबी क्लास है। मैं उस वर्ग में एक विधि से एक तर्क से एक आवृत्ति चर प्राप्त करना चाहता हूँ। मैं एक सरणी के रूप में उदाहरण चर के सभी प्राप्त कर सकते हैं करते हैं:रूबी में, मैं सरणी के बजाय हैश में इंस्टेंस चर कैसे प्राप्त कर सकता हूं?

self.instance_variables 

हालांकि, मैं उदाहरण चर arg नामित प्राप्त करना चाहते हैं, विशेष रूप से:

class MyClass 
    def get_instance_variable(arg) 
    hash_of_instance_variables[arg] 
    end 
end 

object.get_instance_variable('my_instance_var') 

मैं कैसे की गणना करते hash_of_instance_variables?

+0

क्या आप विस्तृत कर सकते हैं? आपका प्रश्न बहुत स्पष्ट नहीं है। –

+4

ऐसा लगता है कि आप एक हैश बनाने की उम्मीद कर रहे हैं जो मैसेज वैरिएबल को उनके मानों में मैप करता है ताकि आप इंस्टेंस वैरिएबल के मान को पुनः प्राप्त कर सकें। यदि हां, तो क्यों? 'Instance_variable_get' का प्रयोग करें। – cam

उत्तर

17

सभी उदाहरण चर आप निम्नलिखित कोड का उपयोग कर सकते का एक हैश बनाने के लिए:

object.instance_variable_get :@my_instance_var 
:

class Object 
    def instance_variables_hash 
    Hash[instance_variables.map { |name| [name, instance_variable_get(name)] } ] 
    end 
end 

लेकिन कैम उसकी टिप्पणी में उल्लेख किया है के रूप में, आप के बजाय instance_variable_get विधि का उपयोग करना चाहिए

1
class MyClass  
def variables_to_hash 
     h = {} 
     instance_variables.each{|a| 
     s = a.to_s 
     n = s[1..s.size] 
     v = instance_variable_get a 
     h[n] = v 
     } 
     h 
    end 
end 
+0

ध्यान दें कि '1. [s.s.size]' 's [1 ..- 1]' के साथ प्रतिस्थापित किया जा सकता है। –

5

प्रश्न काफी पुराना है लेकिन इसके लिए रेल समाधान मिला: instance_values

यह Google में पहला जवाब है इसलिए शायद यह किसी की मदद करेगा।

+0

समुदाय की मदद के लिए धन्यवाद। मैं अब रूबी/रेल का उपयोग नहीं करता, node.js. पर ले जाया गया। बेस्ट –

+0

रेल द्वारा उपयोग किया जाने वाला कोड लगभग अपवाद के साथ स्वीकार किए गए उत्तर के समान है कि रेल अग्रणी '@ 'को दबाता है। –

-1

रेल पर रूबी के पास ऐसा करने के कुछ अंतर्निहित तरीके हैं जो आपको अपनी आवश्यकताओं को पूरा कर सकते हैं।

उपयोगकर्ता = User.new (पहले: 'ब्रायन', पिछले: 'मामले')

user.attributes

{"पहला" => "ब्रायन", "अंतिम" => "केस"}

user.serializeable_hash

{ "पहले" => "ब्रायन", "पिछले" => "मामले"}

+0

यह केवल रेल मॉडल ('ActiveRecord :: बेस' के उदाहरण) पर लागू होता है। एक मनमानी रूबी ऑब्जेक्ट के लिए, @ सुफलर का उत्तर काम करता है। –

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

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