В руководстве по Rust не объясняется, как получить параметры из командной строки. fn main()
отображается только с пустым списком параметров во всех примерах.
Как правильно получить доступ к параметрам командной строки из main
?
источник
В руководстве по Rust не объясняется, как получить параметры из командной строки. fn main()
отображается только с пустым списком параметров во всех примерах.
Как правильно получить доступ к параметрам командной строки из main
?
Вы можете получить доступ к аргументам командной строки с помощью функций std::env::args
или std::env::args_os
. Обе функции возвращают итератор для аргументов. Первый итерирует по String
s (с которым легко работать), но паникует, если один из аргументов не является допустимым юникодом. Последний перебираетOsString
s и никогда не паникует.
Обратите внимание, что первый элемент итератора - это имя самой программы (это соглашение во всех основных ОС), поэтому первый аргумент на самом деле является вторым итеративным элементом.
Простой способ справиться с результатом args
- преобразовать его в Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Вы можете использовать весь стандартный набор инструментов итератора для работы с этими аргументами. Например, чтобы получить только первый аргумент:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Вы можете найти библиотеки на crates.io для анализа аргументов командной строки:
println(args[0])
Docopt также доступен для Rust, который генерирует для вас парсер из строки использования. В качестве бонуса в Rust можно использовать макрос для автоматической генерации структуры и декодирования на основе типов:
И вы можете получить аргументы с:
README и документация содержат множество полных рабочих примеров.
Отказ от ответственности: я один из авторов этой библиотеки.
источник
У Rust есть
getopt
синтаксический анализ CLI-стиля в ящике getopts .источник
Для меня getopts всегда чувствовал себя слишком низкоуровневым, и docopt.rs был слишком большим количеством магии. Я хочу что-то явное и простое, которое по-прежнему обеспечивает все функции, если они мне нужны.
Это где хлопать-RS пригождается.
Это похоже на argparse из Python. Вот пример того, как это выглядит:
Вы можете получить доступ к своим параметрам следующим образом:
(Скопировано из официальной документации )
источник
Начиная с версии 0.8 / 0.9, правильный путь к функции args () будет следующим
::std::os::args
:Похоже, что Rust все еще довольно нестабилен, даже со стандартным вводом-выводом, поэтому он может устареть довольно быстро.
источник
Ржавчина снова изменилась.
os::args()
не рекомендуется в пользуstd::args()
. Ноstd::args()
это не массив, он возвращает итератор . Вы можете перебирать аргументы командной строки, но не можете получить к ним доступ с помощью индексов.http://doc.rust-lang.org/std/env/fn.args.html
Если вы хотите, чтобы аргументы командной строки были вектором строк, это будет работать сейчас:
Ржавчина - учись воспринимать боль перемен.
источник
env::args().collect()
.то, что сказал @barjak, работает со строками, но если вам нужен аргумент в виде числа (в данном случае в формате uint), вам нужно преобразовать так:
источник
Также проверьте structopt:
https://github.com/TeXitoi/structopt
источник
В более новых версиях Rust (Rust> 0.10 / 11) синтаксис массива работать не будет. Вам придется использовать метод get.[Редактировать] Синтаксис массива работает (снова) в ночное время. Таким образом, вы можете выбрать между индексом получателя или массива.
источник
Vec
s. Я предполагаю, что это там в течение месяца или около этого. Смотрите этот пример .Rust развился после ответа Кальвина в мае 2013 года. Теперь можно проанализировать аргументы командной строки с помощью
as_slice()
:источник
as_slice()
больше не существует и&args
должен использоваться вместо этого.В книге Rust «No stdlib» рассказывается, как получить доступ к параметрам командной строки (другой способ).
Теперь в примере также есть,
#![no_std]
что, я думаю, означает, что обычно библиотека std будет иметь истинную точку входа для вашего двоичного файла и будет вызывать глобальную функцию с именемmain()
. Другой вариант - отключитьmain
шим с помощью#![no_main]
. Который, если я не ошибаюсь, говорит компилятору, что вы полностью контролируете запуск своей программы.Я не думаю, что это «хороший» способ делать вещи, если все, что вы хотите сделать, это прочитать аргументы командной строки.
std::os
Модуль упоминается в других ответах , кажется, гораздо лучший способ делать вещи. Я выкладываю этот ответ ради завершения.источник