ARGV - аргументы командной строки в Ruby
Когда вы запускаете скрипт на Ruby, то можете указать любые значения в командной строке после имени скрипта:
Например:
ruby code.rb abc.txt def.txt qqrq.txt
или вот так:
ruby code.rb Hello --machine big -d -tl
Вопрос в том, как программа на Ruby понимает, что передано в командной строке.
Ruby предоставляет массив ARGV со значениями из командной строки. Мы можем получить доступ к элементам этого массива так же, как и в случае любого другого массива:
ARGV[0] это первое значение после имени скрипта.
Мы можем обойти все элементы либо с помощью цикла for:
examples/ruby/command_line_argv.rb
for arg in ARGV puts arg end
либо с помощью диапазона индексов, получая элементы по индексу.
examples/ruby/command_line_argv_with_index.rb
for i in 0 ... ARGV.length puts "#{i} #{ARGV[i]}" end
$ ruby command_line_argv_with_index.rb foo bar --machine big 0 foo 1 bar 2 --machine 3 big
Проверка количества аргументов
Для простой валидации переданных значений мы можем проверить длину массива ARGV. И если мы получили недостаточно аргументов, то сообщить об этом и преждевременно завершить работу программы.
examples/ruby/command_line_argv_check_length.rb
if ARGV.length < 2 puts "Too few arguments" exit end puts "Working on #{ARGV}";
Запустив скрипт, мы получим:
$ ruby command_line_argv_check_length.rb one Too few arguments $ ruby command_line_argv_check_length.rb one two Working on ["one", "two"]
Значения из командной строки имеют тип строка
Во фрагменте кода мы сначала проверяем, получили ли мы точно 2 параметра, и если да, то суммируем их:
examples/ruby/command_line_argv_add.rb
if ARGV.length != 2 puts "We need exactly two arguments" exit end puts ARGV[0] + ARGV[1]
ruby command_line_argv_add.rb 23 19 2319
Результат вас не удивит, если вы знаете, что переданные в командную строку значения, приходят в программу как строки. Даже если это на самом деле числа. Если мы хотим использовать их как числа, то нужно их сконвертировать с помощью to_i:
$ ruby command_line_argv_add_numbers.rb 23 19 42

Published on 2016-02-27