Ruby中字符串的动态变量

时间:2013-10-05 22:07:42

标签: ruby variables dynamic-variables

我正在将文件的每一行复制到单独的文件中,具体取决于内容。每行以"foo""bar"开头,我想读取每行的前几个字符并动态更改文件名变量。

readfile = File.open("myfile.txt", 'r')
file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')

for line in readfile
  writefile = 'file_' + line[0..2]
  writefile.write(line)
end
file_foo.close
file_bar.close

这会引发错误,因为变量writefile引用字符串"file_foo""file_bar"

建议优雅的Rubyist解决方案?我无法从文档中看到如果确实可以采用send方法,那么{/ 1>}方法可以应用于此。

3 个答案:

答案 0 :(得分:2)

制作文件哈希:

readfile = File.open("myfile.txt", 'r')

files = {
  'foo' => File.open("file1.txt", 'w'),
  'bar' => File.open("file2.txt", 'w')
}

for line in readfile
  files[line[0..2]].write(line)
end
files.each {|k, v| v.close}

答案 1 :(得分:0)

我认为您正在寻找eval。它将采用一个字符串并在当前上下文中将其评估为Ruby代码。所以你的例子就变成了:

readfile = File.open("myfile.txt", 'r')

file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')

for line in readfile
  eval('file_' + line[0..2]).write(line)
end

filefoo.close
filebar.close

然而,你要求采用“Rubyist”方法。使用eval肯定不是Rubyist方法。也没有for循环的使用。我会采取更加Rubyist的方法:

infile  = "myfile.txt"
foofile = "file1.txt"
barfile = "file2.txt"

def append_to_file(path, content)
  File.open(path, 'a') { |f| f << content }
end

IO.readlines(readfile).each do |line|
  case line
  when /^foo/
    append_to_file(foofile, line)
  when /^bar/
    append_to_file(barfile, line)
  end
end

答案 2 :(得分:0)

您不能使用send,因为您尝试将字符串转换为不是方法而是局部变量。

从Ruby 2.1开始,您将能够使用Binding#local_variable_get

for line in readfile
  writefile = binding.local_variable_get(:"file_#{line[0..2]}")
  writefile.write(line)
end