【问题标题】:Ruby dynamic variable nameRuby 动态变量名
【发布时间】:2013-05-07 13:02:34
【问题描述】:

有没有办法在 Ruby 中使用动态名称创建变量?

我正在读取一个文件,当我找到一个字符串时,会生成一个哈希。

例如

file = File.new("games.log", "r")

file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      Game_# = Hash.new
    end
  end
end

如何将 Game_# 中的 # 更改为数字(Game_1、Game_2、...)

【问题讨论】:

  • 数字从何而来?
  • 除非您声明类或模块名称,否则在 Ruby 中使用大写字母的变量名被认为是不好的做法。考虑将Game_ 更改为game_。
  • 你会做什么那些动态创建的名字?您的源代码只能通过笨拙的sends 引用它们。对我来说看起来像一个数组。

标签: ruby


【解决方案1】:

你可以用像这样的实例变量来做到这一点

i = 0
file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      instance_variable_set("@Game_#{i += 1}", Hash.new)
    end
  end
end

但你应该像 viraptor 所说的那样使用数组。由于您似乎只有一个新的哈希值作为值,因此可以简单地

i = 0
file.lines do |l|
  l.split do |p|
    if p[1] == "InitGame"
      i += 1
    end
  end
end
Games = Array.new(i){{}}
Games[0] # => {}
Games[1] # => {}
...

【讨论】:

【解决方案2】:

为什么要使用单独的变量?似乎您只是希望 Game 成为一个列表,每次都附加值。然后您可以使用Game[0]、Game[1]、...来引用它们

【讨论】:

    【解决方案3】:

    如果你真的想要动态变量名,可能你可以使用哈希,而不是你可以设置键动态

    file = File.new("games.log", "r")
    lines = {}
    i = 0
    
    file.lines do |l|
      l.split do |p|
        if p[1] == "InitGame"
          lines[:"Game_#{i}"] = Hash.new
          i = i + 1
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 2012-05-14
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2020-11-04
      • 2014-07-09
      • 2014-07-28
      相关资源
      最近更新 更多