O tutorial Rust não explica como obter parâmetros da linha de comando. fn main()
é mostrado apenas com uma lista de parâmetros vazia em todos os exemplos.
Qual é a maneira correta de acessar os parâmetros da linha de comando main
?
fonte
O tutorial Rust não explica como obter parâmetros da linha de comando. fn main()
é mostrado apenas com uma lista de parâmetros vazia em todos os exemplos.
Qual é a maneira correta de acessar os parâmetros da linha de comando main
?
Você pode acessar os argumentos da linha de comando usando as funções std::env::args
ou std::env::args_os
. Ambas as funções retornam um iterador sobre os argumentos. O primeiro itera sobre String
s (que são fáceis de trabalhar), mas entra em pânico se um dos argumentos não for um unicode válido. O último repete sobre se OsString
nunca entra em pânico.
Observe que o primeiro elemento do iterador é o nome do próprio programa (essa é uma convenção em todos os principais sistemas operacionais); portanto, o primeiro argumento é realmente o segundo elemento iterado.
Uma maneira fácil de lidar com o resultado de args
é convertê-lo para Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Você pode usar toda a caixa de ferramentas do iterador padrão para trabalhar com esses argumentos. Por exemplo, para recuperar apenas o primeiro argumento:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Você pode encontrar bibliotecas em crates.io para analisar argumentos da linha de comandos:
println(args[0])
O Docopt também está disponível para o Rust, que gera um analisador para você a partir de uma sequência de uso. Como um bônus no Rust, uma macro pode ser usada para gerar automaticamente a estrutura e decodificar com base no tipo:
E você pode obter os argumentos com:
O README e a documentação têm muitos exemplos de trabalho completos.
Disclaimer: Eu sou um dos autores desta biblioteca.
fonte
Rust possui um
getopt
argumento de CLI no estilo, analisando na caixa de getopts .fonte
Para mim, os getopts sempre pareciam muito baixos e o docopt.rs era muito mágico. Quero algo explícito e direto que ainda ofereça todos os recursos, se eu precisar.
É aqui que o clap-rs é útil.
Parece um pouco com o argparse do Python. Aqui está um exemplo de como ele se parece:
Você pode acessar seus parâmetros assim:
(Copiado da documentação oficial )
fonte
A partir da versão 0.8 / 0.9, o caminho correto para a função args () seria
::std::os::args
, ou seja:Parece que o Rust ainda é bastante volátil no momento, mesmo com IO padrão, portanto, isso pode ficar desatualizado rapidamente.
fonte
Ferrugem mudou novamente.
os::args()
foi descontinuado em favor destd::args()
. Masstd::args()
não é uma matriz, ele retorna um iterador . Você pode iterar sobre os argumentos da linha de comando, mas não pode acessá-los com subscritos.http://doc.rust-lang.org/std/env/fn.args.html
Se você quiser os argumentos da linha de comando como um vetor de strings, isso funcionará agora:
Ferrugem - aprenda a abraçar a dor da mudança.
fonte
env::args().collect()
.o que o @barjak disse funciona para strings, mas se você precisar do argumento como um número (neste caso, um uint), precisará converter assim:
fonte
Confira também o structopt:
https://github.com/TeXitoi/structopt
fonte
A partir das versões mais recentes do Rust (Rust> 0,10 / 11), a sintaxe da matriz não funciona. Você precisará usar o método get.[Editar] A sintaxe da matriz funciona (novamente) à noite. Assim, você pode escolher entre o índice getter ou array.
fonte
Vec
s. Eu acho que está lá por mais ou menos um mês. Veja este exemplo .O Rust evoluiu desde a resposta de Calvin em maio de 2013. Agora, seria possível analisar os argumentos da linha de comando com
as_slice()
:fonte
as_slice()
não existe mais e&args
deve ser usado.O capítulo "No stdlib" do livro Rust aborda como acessar os parâmetros das linhas de comando (outra maneira).
Agora, o exemplo também possui o
#![no_std]
que eu acho que significa que, normalmente, a biblioteca std teria o verdadeiro ponto de entrada para o seu binário e chamaria uma função global chamadamain()
. Outra opção é 'desativar omain
calço' com#![no_main]
. O que, se não me engano, é dizer ao compilador que você está assumindo o controle total sobre como o programa é iniciado.Eu não acho que essa seja uma maneira 'boa' de fazer as coisas se tudo o que você quer fazer é ler os argumentos da linha de comando. O
std::os
módulo mencionado em outras respostas parece ser uma maneira muito melhor de fazer as coisas. Eu posto esta resposta para fins de conclusão.fonte