在另一个变量的名称中使用变量

时间:2013-10-12 11:10:02

标签: ruby erb

如何在另一个变量的名称中使用变量?说,我有很多像这样的数组:

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。我怎么能这样做?

2 个答案:

答案 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动态创建实际文件,即该文件可能有或可能没有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

它实际上正在做我真正想要的但我相信有更好的方法来做到这一点。干杯!!

相关问题