Ruby 一次将所有参数传递给方法
我试图从文本文件中读取参数,并将它们同时传递给Ruby方法。 文本文件中的参数格式正确,例如:Ruby 一次将所有参数传递给方法,ruby,arrays,argument-passing,Ruby,Arrays,Argument Passing,我试图从文本文件中读取参数,并将它们同时传递给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"
我打算进行如下函数调用:
my_method("path", ["elem1","elem2"], 4,"string")
IO.readlines("path").each do |line|
puts "#{line}"
my_method(*line.split(","))
end
希望我能做到这一点:
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”中的第一个参数之后出现“,”意外“,”
“
来包装参数呢。如果不将参数括在引号中,则会得到main:object的未定义变量error
我有一个解决方案,但不是使用“,”作为分隔符,而是在输入行中使用其他一些特殊字符作为分隔符
# 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
我希望这对你有帮助。如果你有任何问题,请告诉我
IO.readlines("path").each do |line|
params = line.split(",").each do |param|
param = eval(param)
end
my_method(*params)
end
当您读取该行时,所有参数都是字符串,因此要获取数组和整数,您可以先尝试求值
eval
提示可能足以修复代码eval
提示应该可以解决这个问题OBS:小心使用
eval
,因为它会执行任何代码,一个删除文件的命令,或者更糟糕的(比如弄乱了计算机或服务器),如果文件源的幕后人员知道它的话。数组元素不是“用引号括起来的”,而是传递带有引号的字符串。您认为您正在“评估”文件中的行,因此,例如,您有一个实际的数组,但您没有。您使用的是哪个文件扩展名?(*.txt或*.csv或哪个?)@DaveNewton Newton,当我使用调试器设置断点时,数组中的每个元素似乎都用引号括起来。。所以“hello”=>“hello”和5=>“5”@ManishDas,我不确定我是否理解你。IO.readlines中使用的文件是.txt,执行此操作的代码是*.rb文件。您是否考虑过在输入文件中使用*.csv,或者无法灵活地切换到*.csv?因为如果您使用CSV文件,那么它将帮助您解析列中的输入,这样您将获得您现在正在尝试的方式。