如何在另一个变量的名称中使用变量?说,我有很多像这样的数组:
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
。我怎么能这样做?
答案 0 :(得分: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"]
虽然技术上可以完全按照你的要求做,但我建议你反对它(因此不会发布代码)。你似乎是新人,所以你有很多东西需要学习。不要学习错误的方法。
答案 1 :(得分:1)
这是为了回答我自己的问题,与我原来的问题完全不同,但它完全(好或多或少)提供相同的目的。所以,正如Sergio建议的那样:假设示例输入文件是这样的:
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
使用可变数量的OS动态创建实际文件,即该文件可能有或可能没有Mac
或Win
。从那里开始,这就是我到目前为止所提出的......
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
它实际上正在做我真正想要的但我相信有更好的方法来做到这一点。干杯!!