2013-10-12 167 views
1

如何在另一個變量的名稱中使用變量?我說,我有這樣一個數量的陣列:在另一個變量的名稱中使用變量

g_OS = ['Mac', 'Linux', 'Win'] 
g_Mac = ['Lion', 'Tiger', 'Jaguar'] 
g_Linux = ['Slackware', 'RedHat', 'Caldera'] 
g_Win = [ .... ] 

如果我這樣做:g_OS.each {|OS| puts "g_#{OS}[0]"},將打印'g_Mac[0]''g_Linux'爲文字字符串。但我真正想要的是獲得數組的第一個元素:g_Mac。我怎樣才能做到這一點?

回答

1

這是回答我自己的問題,與我原來的問題完全不同,但它完全(或多或少)用於相同的目的。所以,建議塞爾吉奧:說的例子輸入文件是這樣的:

maci:ruby san$ cat OSs.txt 
Slackware, Linux, i-num=1 
Jaguar, MacX, i-num=6 
Chicago, this_Win, i-num=2 
Daytona, an_other_Win, i-num=7 
RedHat, Linux, i-num=5 
Lion, MacY, i-num=4 
Caldera, Linux, i-num=9 
Longhorn, that_Win, i-num=8 
Tiger, MacZ, i-num=3 
Indiana, Solaris, i-num=10 
Kodiak, MacX, i-num=11 

實際的文件,動態與操作系統即文件的數量可變的創造可能會或可能不會有MacWin的。從那裏走,這是我想出了到目前爲止....

inFile = "OSs.txt" 
os = {} 

open(inFile, 'r').each do |line| 
    next if line =~ /^\s*(#|$)/ 

    if line.split(',').map(&:strip)[1] =~ /^Mac/ 
     (os[:Mac] ||= []) << line.split(',').map(&:strip)[0] 
    end 

    if line.split(',').map(&:strip)[1] =~ /_Win$/ 
     (os[:Win] ||= []) << line.split(',').map(&:strip)[0] 
    end 

    if line.split(',').map(&:strip)[1] !~ /(^Mac|_Win$)/ 
     (os[:Linux] ||= []) << line.split(',').map(&:strip)[0] 
    end 
end 

os.each_key do |cls| 
    p "%s [%s]" % [os[cls][0], os[cls].count] 
end 

這幾乎是做什麼其實我是想,但我相信有這樣做的很多更好的辦法。乾杯!!

+1

這是你的代碼的稍微改進版本:http://pastie.org/8397525 –

+0

@Sergio Tulentsev:是的,肯定更好。謝謝! – MacUsers

6

通常情況下,重新整理數據更簡單。例如,像這樣。

g_OS = { 
    'Mac' => ['Lion', 'Tiger', 'Jaguar'], 
    'Linux' => ['Slackware', 'RedHat', 'Caldera'], 
    'Win' => ['Chicago', 'Daytona', 'Longhorn'] 
} 

# list just the OSes 

g_OS.keys # => ["Mac", "Linux", "Win"] 

# only linuxes 
g_OS['Linux'] # => ["Slackware", "RedHat", "Caldera"] 

儘管在技術上可以做到完全符合您的要求,但我建議您不要這樣做(因此不會發布代碼)。你似乎是新的,所以你有很多東西要學。不要學習錯誤的方法。

+0

是的,我對「Ruby」業務非常陌生,我的知識僅限於爲Puppet編寫ERB模板。順便說一句,在原始模板中,第一個數組的值(在本例中爲'g_OS')是從一個文件動態生成的,其他的也是如此。按照您的建議安排數據可能會使ERB模板變得複雜一些(??)。在另一張紙上,你介意解釋我原來的方法有什麼問題嗎? – MacUsers

+0

我試圖按照你的建議,但沒有這樣的喜悅呢。那麼,如何從這樣的文件中對這樣的數組進行散列:'Slackware,Linux,i-num = 1 ||捷豹,Macx,i-num = 6 ||芝加哥,that_Win,i-num = 2 || Daytona,this_Win,i-num = 7 || RedHat,Linux,i-num = 5 || Tiger,Macy,i-num = 3'('||'當然是換行符。)乾杯! – MacUsers

+0

@MacUsers:在評論中很難閱讀代碼。問另一個問題。 –

相關問題