Ruby-从文件创建未知数量的变量

时间:2018-08-21 20:09:21

标签: ruby file variables

这可能很难解释,但我会尽力的。

假设我有一个文本文件,其中包含:

variable one
I'm variable 2
300
False
I am variable 5

让我们假设我有多个这样的文件,并且我不知道每个文件中的内容。我想将文件中的每一行放入一个变量中。

例如,此文件将成为以下变量(我可以使用if语句将其分为字符串,数字和布尔值):

var1 = "variable one"
var2 = "I'm variable 2"
var3 = 300
var4 = False
var5 = "I am variable 5"

我想确保可以将其应用于任何行数的文件。

这是我希望代码看起来像的一个例子:

File.open("file.txt").each do |line|
  var.new = "var" + line.line_number #creates new variable named "var" and the line number
var = line
end

我希望有人能理解并知道该怎么做,因为我完全陷入了困境。我觉得这里有一种非常简单的解决方案,每个人都知道,但我很想念它,或者我只是不知道。

谢谢,里斯(Reece)

3 个答案:

答案 0 :(得分:1)

这回答了您的问题,但是以与您的应用程序实际相关的方式执行此操作当然需要上下文。

这不一定是唯一的方法,甚至不一定是“最佳”的方法,但我认为这是最简单的方法:

basename()

如果要将$url = "https://www.example.com/images/assets/screenshots/this-is-an-example/2016-12-20_15-42-29.png"; $endOfUrl = strpos($url, '/assets/') !== false ? basename($url) : ''; echo $endOfUrl; File.read("file.txt").split("\n").each_with_index do |line, index| instance_variable_set("@var#{index}", line) end @var0 #variable one @var1 #I'm variable 2 从字符串(即从文件中读取的字符串)转换为ruby对象,则必须进行一些手动解析。说,

False

也许您只想将文件读取为数组。

300

答案 1 :(得分:0)

感觉就像您真的想要一个数组。为此,您可以将文件直接读入数组,每行一个条目:

array_of_lines = File.readlines("file.txt")
array_of_lines[0]
=> "variable one\n"
array_of_lines[1]
=> "300\n"

答案 2 :(得分:0)

您可以将其作为具有内置解析逻辑的类来实现(我只处理了给定的示例):

class VarGroup
  attr_reader :vars
  def initialize(file_name)
    @vars = File.foreach(file_name).map do |l|
      if l =~ /(True|False)/i
        l.match?(/True/i)
      else  
        begin  
          Integer(l)
        rescue ArgumentError 
          l.strip
        end  
      end
    end
  end

  def method_missing(method_name,*args,&block)
    if method_name =~ /var(\d+)/ && $1.to_i.nonzero? && $1.to_i <= vars.size
      @vars[$1.to_i - 1] 
    else 
      super
    end
  end
end 

然后可以像

一样调用它
v = VarGroup.new('test.txt')
v.vars 
#=> ["variable one", "I'm variable 2", 300, false, "I am variable 5"]
(1..6).each do |n|
  p v.public_send("var#{n}")
end
# "variable one"
# "I'm variable 2"
# 300
# false
# "I am variable 5"
# undefined method `var6' for #<VarGroup:0x000055a23e2f64e0>