【问题标题】:Passing all arguments at once to a method一次将所有参数传递给方法
【发布时间】:2012-03-13 01:46:38
【问题描述】:

我正在尝试从文本文件中读取参数并将它们一次全部传递给 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 错误。

【问题讨论】:

  • 数组元素不是“用引号括起来的”,您传递的是其中包含引号的字符串。您认为您正在“评估”文件中的行,因此您拥有例如一个实际的数组,但您没有。
  • 您使用的是哪个文件扩展名? (*.txt 或 *.csv 还是哪个?)
  • @DaveNewton Newton ,当我使用调试器放置断点时,数组中的每个元素似乎都包含在引号中。所以 "hello" => ""hello"" 和 5=> “5”
  • @ManishDas ,不确定我是否明白你的意思。 IO.readlines 中使用的文件是 .txt,执行此操作的代码在 *.rb 文件中
  • 您是否考虑过使用 *.csv 作为输入文件,或者您不灵活地切换到 *.csv?因为如果您使用 CSV 文件,那么它将帮助您解析列中的输入,这样您就可以得到您现在正在尝试的方式。

标签: ruby arrays argument-passing


【解决方案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

我希望这对您有所帮助。如果您有任何问题,请告诉我。

【讨论】:

    【解决方案2】:
    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 提示应该可以解决这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2017-01-05
      • 2013-10-04
      • 2013-05-19
      • 2013-02-08
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多