我正在尝试从文本文件中读取参数,并将它们全部传递给Ruby方法。 文本文件中的参数格式正确,例如:
"path", ["elem1","elem2"], 4,"string"
我打算像这样进行函数调用:
my_method("path", ["elem1","elem2"], 4,"string")
这有希望我试图实现这样的目标:
IO.readlines("path").each do |line|
puts "#{line}"
my_method(*line.split(","))
end
问题是在方法中所有数组元素都用引号括起来。所以我的方法最终得到了这个:
""path"", "["elem1","elem2"]", "4",""string""
现在,这可能是因为它是一个字符串数组,但是当我说""
时为什么要用额外的*arr
包装它?
如果我使用eval:
IO.readlines("path").each do |line|
puts "#{line}"
my_method(*eval(line))
end
我在“path”中的第一个参数,[“elem1”,“elem2”],4,“string”
之后出现语法错误,意外','如何通过从文本文件中读取参数来实现将所有元素传递给方法
此外,由于Ruby不关心类型,为什么我必须首先用""
包装我的参数。如果我不将参数包装在引号中,则会出现undefined variable for main:object
错误。
答案 0 :(得分:1)
我有一个解决方案,但不是使用“,”作为分隔符,而是在输入行中使用其他特殊字符作为分隔符。
# Input line in somefile.txt delimited by "||" :
# "path" || ["elem1","elem2"] || 4 || "string"
def my_method(arg1, arg2, arg3, arg4)
path = arg1
arr = arg2.gsub(/([\[\]])/, "").split(",")
number = arg3.to_i
string = arg4
puts "path : #{path} and is #{path.class}"
puts "arr : #{arr} and is #{arr.class}"
puts "number : #{number} and is #{number.class}"
puts "string : #{string} and is #{string.class}"
end
IO.readlines("somefile.txt").each do |line|
my_method(*line.gsub(/[(\\")]/, " ").split("||"))
end
我希望这能帮到你。如果您有任何问题,请告诉我。
答案 1 :(得分:0)
IO.readlines("path").each do |line|
params = line.split(",").each do |param|
param = eval(param)
end
my_method(*params)
end
当你读取这一行时,所有参数都是字符串,所以为了得到数组和整数,你可能会先尝试eval。
eval
提示可能足以修复您的代码。
如果您传递没有引号的参数,解释器会将其理解为常量而不是字符串。这就是为什么你得到未定义的变量。同样,eval
提示应解决此问题。
OBS:小心eval
因为它会执行任何代码,删除文件的命令甚至更糟(如乱用你的计算机或服务器)如果该文件源背后的人知道它。