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 希望我能

我试图从文本文件中读取参数,并将它们同时传递给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
希望我能做到这一点:

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不关心类型,为什么我首先要用
    来包装参数呢。如果不将参数括在引号中,则会得到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文件,那么它将帮助您解析列中的输入,这样您将获得您现在正在尝试的方式。