将所有参数一次传递给方法

时间:2012-03-13 01:46:39

标签: 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""

现在,这可能是因为它是一个字符串数组,但是当我说""时为什么要用额外的*arr包装它?

如果我使用eval:

 IO.readlines("path").each do |line|
    puts "#{line}"
    my_method(*eval(line))
  end

我在“path”中的第一个参数,[“elem1”,“elem2”],4,“string”

之后出现语法错误,意外','
  1. 如何通过从文本文件中读取参数来实现将所有元素传递给方法

  2. 此外,由于Ruby不关心类型,为什么我必须首先用""包装我的参数。如果我不将参数包装在引号中,则会出现undefined variable for main:object错误。

2 个答案:

答案 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。

  1. eval提示可能足以修复您的代码。

  2. 如果您传递没有引号的参数,解释器会将其理解为常量而不是字符串。这就是为什么你得到未定义的变量。同样,eval提示应解决此问题。

  3. OBS:小心eval因为它会执行任何代码,删除文件的命令甚至更糟(如乱用你的计算机或服务器)如​​果该文件源背后的人知道它。