2013-05-07 15 views
22

गतिशील नामों के साथ रुबी में चर बनाने के लिए कोई तरीका है?रूबी गतिशील चर नाम

मैं एक फाइल पढ़ रहा हूं और जब मुझे स्ट्रिंग मिलती है, तो हैश उत्पन्न करता है।

उदा।

file = File.new("games.log", "r") 

file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     Game_# = Hash.new 
    end 
    end 
end 

मैं कैसे संख्या को Game_ # में # बदल सकता है (Game_1, Game_2, ...)

+0

संख्याएं कहां से आती हैं? – sawa

+0

जब तक आप कक्षा या मॉड्यूल नाम घोषित नहीं कर लेते हैं, तब तक पूंजी पत्र के साथ एक परिवर्तनीय नाम रूबी में खराब अभ्यास माना जाता है। 'Game_' को 'game_' में बदलने पर विचार करें। –

+1

उन गतिशील रूप से बनाए गए नामों के साथ आप * क्या करेंगे? आपका स्रोत कोड उनको संदर्भित नहीं कर सकता है जो क्लंकी 'प्रेषण' के माध्यम से छोड़कर। मुझे एक सरणी की तरह लग रहा है। –

उत्तर

32

आप की तरह

i = 0 
file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     instance_variable_set("@Game_#{i += 1}", Hash.new) 
    end 
    end 
end 

उदाहरण चर के साथ यह कर सकते हैं, लेकिन जैसा कि viraptor कहते हैं कि आप एक सरणी का उपयोग करना चाहिए। जब से तुम मान के रूप में बस एक नई हैश है लगता है, यह बस

i = 0 
file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     i += 1 
    end 
    end 
end 
Games = Array.new(i){{}} 
Games[0] # => {} 
Games[1] # => {} 
... 
+1

आपको बहुत धन्यवाद @ सवा! –

+1

बहुत दिलचस्प है। – sidney

+0

अधिक जानकारी: http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get –

8

अलग चर का प्रयोग क्यों? ऐसा लगता है कि आप हर बार संलग्न मूल्यों के साथ एक सूची होने के लिए Game चाहते हैं। उसके बाद आप उन्हें Game[0], Game[1] साथ संदर्भित कर सकते हैं, ...

0

तुम सच में गतिशील चर नाम चाहते हैं हो सकता है, यदि आप एक हैश का उपयोग कर सकते हो सकता है, अपने निर्धारित कर सकते हैं की तुलना में प्रमुख गतिशील

file = File.new("games.log", "r") 
lines = {} 
i = 0 

file.lines do |l| 
    l.split do |p| 
    if p[1] == "InitGame" 
     lines[:"Game_#{i}"] = Hash.new 
     i = i + 1 
    end 
    end 
end 
संबंधित मुद्दे