Puede acceder a los argumentos de la línea de comandos utilizando las funciones std::env::args
o std::env::args_os
. Ambas funciones devuelven un iterador sobre los argumentos. El primero itera sobre String
s (que es fácil trabajar con él) pero entra en pánico si uno de los argumentos no es válido unicode. Este último itera sobre OsString
sy nunca se asusta.
Tenga en cuenta que el primer elemento del iterador es el nombre del programa en sí (esta es una convención en todos los sistemas operativos principales), por lo que el primer argumento es en realidad el segundo elemento iterado.
Una manera fácil de lidiar con el resultado de args
es convertirlo a Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Puede usar toda la caja de herramientas de iterador estándar para trabajar con estos argumentos. Por ejemplo, para recuperar solo el primer argumento:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Puede encontrar bibliotecas en crates.io para analizar los argumentos de la línea de comandos:
- docopt : solo escribe el mensaje de ayuda y se genera el código de análisis.
- clap : describe las opciones que desea analizar utilizando una API fluida. Más rápido que docopt y te da más control.
- getopts : puerto de la popular biblioteca C. Nivel inferior y aún más control.
- structopt : construido sobre el aplauso, es aún más ergonómico de usar.
println(args[0])
Docopt también está disponible para Rust, que genera un analizador para usted a partir de una cadena de uso. Como beneficio adicional en Rust, se puede usar una macro para generar automáticamente la estructura y hacer decodificación basada en tipo:
Y puedes obtener los argumentos con:
El archivo README y la documentación tienen muchos ejemplos de trabajo completos.
Descargo de responsabilidad: soy uno de los autores de esta biblioteca.
fuente
Rust tiene un
getopt
estilo de argumento CLI analizando en la caja de getopts .fuente
Para mí, los getopts siempre se sentían demasiado bajos y docopt.rs era demasiada magia. Quiero algo explícito y directo que todavía proporcione todas las características si las necesito.
Aquí es donde los aplausos son útiles.
Se siente un poco como argparse de Python. Aquí hay un ejemplo de cómo se ve:
Puede acceder a sus parámetros así:
(Copiado de la documentación oficial )
fuente
A partir de la versión 0.8 / 0.9, la ruta correcta a la función args () sería
::std::os::args
, es decir:Parece que Rust todavía es bastante volátil en este momento, incluso con E / S estándar, por lo que puede desactualizarse con bastante rapidez.
fuente
El óxido cambió de nuevo.
os::args()
está en desuso a favor destd::args()
. Perostd::args()
no es una matriz, devuelve un iterador . Puede iterar sobre los argumentos de la línea de comandos, pero no puede acceder a ellos con subíndices.http://doc.rust-lang.org/std/env/fn.args.html
Si desea los argumentos de la línea de comando como un vector de cadenas, esto funcionará ahora:
Rust: aprende a abrazar el dolor del cambio.
fuente
env::args().collect()
.lo que @barjak dijo funciona para cadenas, pero si necesita el argumento como un número (en este caso, un uint), debe convertirlo así:
fuente
También echa un vistazo a structopt:
https://github.com/TeXitoi/structopt
fuente
A partir de las versiones más recientes de Rust (Rust> 0.10 / 11), la sintaxis de la matriz no funcionará. Tendrá que usar el método get.[Editar] La sintaxis de la matriz funciona (de nuevo) en la noche. Por lo tanto, puede elegir entre el getter o el índice de matriz.
fuente
Vec
s. Supongo que está allí durante un mes más o menos. Ver este ejemplo .Rust ha evolucionado desde la respuesta de Calvin de mayo de 2013. Ahora uno analizaría los argumentos de la línea de comandos con
as_slice()
:fuente
as_slice()
ya no existe y&args
debería usarse en su lugar.El capítulo del libro Rust "No stdlib" cubre cómo acceder a los parámetros de las líneas de comando (otra forma).
Ahora, el ejemplo también tiene
#![no_std]
lo que creo que significa que normalmente, la biblioteca estándar tendría el verdadero punto de entrada para su binario y llamaría a una función global llamadamain()
. Otra opción es 'deshabilitar lamain
cuña' con#![no_main]
. Lo que si no me equivoco es decirle al compilador que está tomando el control total sobre cómo se inicia su programa.No creo que esta sea una 'buena' forma de hacer las cosas si todo lo que quieres hacer es leer los argumentos de la línea de comandos. El
std::os
módulo mencionado en otras respuestas parece ser una forma mucho mejor de hacer las cosas. Publico esta respuesta para completarla.fuente