Вызывающая система Ruby или exec с переменным количеством параметров - PullRequest
0 голосов
/ 17 октября 2018

Я хочу вызывать некоторые системные команды из сценария ruby, не разбираясь с оболочкой.Суть в том, что во время кодирования я не знаю, сколько будет аргументов.

Если бы я шел через оболочку, я бы собрал командную строку путем конкатенации ...

Я делал это в perl, передавая system и array с любым количеством аргументов, которые я хотел.Это сработало из-за способа передачи параметров в perl.Неудивительно, что Ruby не поддерживает это.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Поместите аргументы в массив:

cmd = %w[ls -l -a]

, а затем разделите этот массив при вызове system:

system(*cmd)
# -----^ splat

Это то же самое, что сказать:

system('ls', '-l', '-a')

Тот же синтаксис используется для принятия переменного числа аргументов при вызове метода:

def variadic_method(*args)
  # This splat leaves all the arguments in the
  # args array
  ...
end
0 голосов
/ 17 октября 2018

Это то, что вы, возможно, имеете в виду?Как показано на:

https://ruby -doc.com / docs / ProgrammingRuby / html / tut_methods.html

Но что, если вы хотите передатьпеременное число аргументов или хотите захватить несколько аргументов в один параметр?Размещение звездочки перед именем параметра после параметров `` normal '' делает именно это.

def varargs (arg1, * rest) "Got # {arg1} и # {rest.join (',')} "end

varargs (" один ")» "Получил один и"

varargs ("один", "два") »" Получил один и два "

varargs «один», «два», «три» »« Получил один и два, три »

В этом примере первый аргумент назначается первому параметру метода, как обычно.Однако к следующему параметру добавляется звездочка, поэтому все остальные аргументы объединяются в новый массив, который затем назначается этому параметру.>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...