Передача всех аргументов одновременно методу - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь прочитать аргументы из текстового файла и передать их все сразу в метод 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 ]

1 голос
/ 13 марта 2012

У меня есть одно решение, но вместо "," в качестве разделителя используйте какой-то другой специальный символ в качестве разделителя в строке ввода.

# 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

Надеюсь, это помогло вам. Дайте мне знать, если у вас возникнут проблемы.

0 голосов
/ 27 мая 2014
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, поскольку он выполнит любой код, команду для удаления файла или, что еще хуже (например, беспорядок на вашем компьютере или сервере), если человек, стоящий за источником этого файла, знает это.

...