代码之家  ›  专栏  ›  技术社区  ›  chutsu

当新变量已经分配给某个对象时,如何分配新变量名?红宝石

  •  1
  • chutsu  · 技术社区  · 16 年前

    这个标题真的不能解释问题。我的情况是,我想读取一个文件,并将内容放入哈希。现在,我想让它更聪明,我想创建一个循环,打开一个目录中的每个文件,并将其放入哈希。问题是我不知道如何相对于文件名分配名称。如:

    hash={}  
    Dir.glob(path + "*") do |datafile|
      file = File.open(datafile)
      file.each do |line|
        key, value = line.chomp("\t")
        # Problem here is that I wish to have a different
        # hash name for every file I loop through
        hash[key]=value
      end
      file.close
    end
    

    这有可能吗?

    6 回复  |  直到 16 年前
        1
  •  1
  •   a2800276    16 年前

    您想用您处理的文件名动态创建变量吗?

    试试这个:

    Dir.glob(path + "*") do |fileName|
      File.open(fileName) {
    
        # the variable `hash` and a variable named fileName will be
        # pointing to the same object... 
        hash = eval("#{fileName} = Hash.new")
    
        file.each do |line|
          key, value = line.chomp("\t")
          hash[key]=value
        end
      }
    end
    

    当然,您必须确保首先清除文件名。名为“bla.txt”的变量在ruby中无效,而“path/to/bla.csv”也无效。

        2
  •  8
  •   j.p.    16 年前

    为什么不使用一个哈希,其键是文件名(在您的例子中是“data file”),其值是插入数据的哈希?

    hash = Hash.new { |h, key| h[key] = Hash.new }  
    Dir.glob(path + '*') do |datafile|
      next unless File.stat(datafile).file?
      File.open(datafile) do |file|
        file.each do |line|
          key, value = line.split("\t")
          puts key, value
          # Different hash name for every file is now hash[datafile]
          hash[datafile][key]=value
        end
      end
    end
    
        3
  •  1
  •   jgre    16 年前

    如果您想要创建一个动态变量,您也可以使用instance变量集(假设实例变量也可以)。

    Dir.glob(path + "*") do |datafile|               
      file = File.open(datafile)                     
      hash = {}                                      
      file.each do |line|                            
        key, value = line.chomp("\t")                
        hash[key] = value                            
      end                                            
      instance_variable_set("@file_#{File.basename(datafile)}", hash)    
    end
    

    只有当文件名是有效的Ruby变量名时,这才有效。否则,您需要进行一些转换。

        4
  •  0
  •   Vinay Sajip    16 年前

    你不能就这样做吗?

    filehash = {} # after the File.open line
    
    ...
    # instead of hash[key] = value, next two lines
    hash[datafile] = filehash
    filehash[key] = value
    
        5
  •  0
  •   collimarco    16 年前

    您可能希望使用如下内容:

    hash[file] = {}
    hash[file][key] = value
        6
  •  0
  •   Qianjigui    16 年前

    现在两个哈希就足够了。 filehash->linehash->内容。