Ruby:
Чтение аргументов командной строки
Как это сделать:
Для получения аргументов командной строки Ruby предоставляет простой массив: ARGV
. Он содержит все переданные аргументы в том порядке, в котором они были даны.
# hello.rb
name = ARGV[0] || "World"
puts "Привет, #{name}!"
# Запустить с: ruby hello.rb Alice
# Вывод: Привет, Alice!
Для обработки нескольких аргументов:
# greet.rb
name, time_of_day = ARGV
puts "Добрый #{time_of_day || 'день'}, #{name || 'там'}!"
# Запустить с: ruby greet.rb Bob Morning
# Вывод: Доброе утро, Bob!
Создайте опции с помощью цикла:
# options.rb
options = {}
ARGV.each do |arg|
key, value = arg.split('=')
options[key.to_sym] = value
end
p options
# Запустить с: ruby options.rb name=Tom age=30
# Вывод: {:name=>"Tom", :age=>"30"}
Глубокое погружение
Чтение аргументов командной строки - практика такая же старая, как сами интерфейсы командной строки. Речь идет о использовании пользовательского ввода без графического интерфейса - это важно для автоматизации или выполнения скриптов на серверах.
ARGV
в Ruby - это не уникальность; многие языки имеют что-то подобное. Тем не менее, реализация в Ruby делает ставку на простоту и ясную синтаксис - без лишних хлопот, просто массив.
Под поверхностью, ARGV
- это просто экземпляр Array
, предварительно заполненный аргументами, которые появляются после имени скрипта в вызове команды. Ruby настраивает его до начала выполнения вашего кода, делая его сразу готовым к использованию.
Альтернативы? Конечно. Для сложных нужд, таких как разбор флагов (например, --verbose
или -v
), в Ruby есть класс OptionParser
в стандартной библиотеке. Это может справляться с более широкими задачами, чем ARGV
, такими как значения по умолчанию, автоматическое преобразование типов и генерация сообщений справки.
Иногда вы просто хотите знать, был ли предоставлен аргумент или нет, не обращая внимания на его значение. Для этого подходит ARGV.include?
.
Смотрите также
- Введение в
OptionParser
: https://ruby-doc.org/stdlib-2.7.0/libdoc/optparse/rdoc/OptionParser.html - Больше о аргументах командной строки в Ruby: https://www.rubyguides.com/2018/12/ruby-argv/