Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中字符串的动态变量_Ruby_Variables_Dynamic Variables - Fatal编程技术网

Ruby中字符串的动态变量

Ruby中字符串的动态变量,ruby,variables,dynamic-variables,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] write

我正在根据内容将文件的每一行复制到单独的文件中。每一行都以
“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\u foo”
“file\u bar”

一个优雅的红宝石解决方案的建议?从文档中我看不到如果确实是这样的话,如何在这里应用
send
方法。

对文件进行散列:

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}

我想你在找
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
但是,您要求采用“红宝石”方法。使用
eval
肯定不是鲁比主义的方法。
也不能用于
循环。我将尝试一种更为红宝石主义的方法:

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
infle=“myfile.txt”
foofile=“file1.txt”
barfile=“file2.txt”
def append_到_文件(路径、内容)

File.open(路径'a'){| f | f您不能使用
send
,因为您试图将字符串转换为的不是方法,而是局部变量

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
在Ruby 2.1中,您将能够使用
绑定#局部变量_get

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

另外,请记住,在写入模式(“w”)下打开文件将在后续写入时覆盖文件内容取而代之。谢谢。为什么“eval”不是Rubyist方法?您的第一个答案看起来肯定更经济。使用
eval
会有很多危险。例如,它会产生巨大的安全漏洞,并且几乎不可能在更大的系统中调试。以前从未遇到过这种情况……看起来很有趣。为什么要使用t与if-else语句相对应的是什么?@Jonathan_W:一点也不经济。
eval
可能是Ruby中效率最低的一种方法,一个安全漏洞,对于这种类型的东西来说,丑陋且杀伤力过大。这似乎是一个非常有用的补充……我看到预览现在已经出来了,但现在是最后一个了update@Jonathan_W:谢谢。这是一个简单的专业问题,它需要一个简单的解决方案。实际问题的好解决方案!对不起,我必须在这里吹毛求疵。首先,正如我前面提到的,Ruby程序员从不使用
进行
循环。就像以前一样。他们使用
each
等方法。其次,如果文件中的一行不完全以“foo”或“bar”开头,这个程序就会崩溃。一个第三,这无法正确处理打开的文件。如果程序在任何地方失败,您将有3个打开的文件需要手动清理。即使没有失败,您仍将有一个打开的文件需要清理(myfile.txt)。如果你想学习Ruby,你需要注意这些事情。@rickyrickyrice:我知道。它是想解决OP代码中的主要问题,而不是开始代码审查。把这些评论留给OP,而不是我。OP要求Ruby解决方案,这是我选择它的唯一原因。而且,现在读到它,我的评论被认为非常有敌意,对此我很抱歉。我最后一个吹毛求疵的地方是:在“w”模式下打开文件会在后续写入中覆盖该文件。您需要在“a”模式下打开它。