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. 我怎样才能做到这一点?

4

2 回答 2

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"]

尽管在技术上可以完全按照您的要求进行操作,但我建议您不要这样做(因此不会发布代码)。你似乎是新人,所以你有很多东西要学。不要学习错误的方法。

于 2013-10-12T11:14:40.790 回答
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

实际文件是使用可变数量的操作系统动态创建的,即该文件可能有也可能没有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

它几乎是在做我真正想做的事情,但我相信有很多更好的方法可以做到这一点。干杯!!

于 2013-10-12T17:59:39.687 回答