The Rust tutorial tidak menjelaskan bagaimana untuk mengambil parameter dari baris perintah. fn main()
hanya ditampilkan dengan daftar parameter kosong di semua contoh.
Dari mana cara yang benar mengakses parameter baris perintah main
?
sumber
The Rust tutorial tidak menjelaskan bagaimana untuk mengambil parameter dari baris perintah. fn main()
hanya ditampilkan dengan daftar parameter kosong di semua contoh.
Dari mana cara yang benar mengakses parameter baris perintah main
?
Anda dapat mengakses argumen baris perintah dengan menggunakan fungsi std::env::args
atau std::env::args_os
. Kedua fungsi mengembalikan iterator atas argumen. Mantan iterates over String
s (yang mudah untuk bekerja dengan) tetapi panik jika salah satu argumen tidak valid unicode. Yang terakhir ini berulang-ulang OsString
dan tidak pernah panik.
Perhatikan bahwa elemen pertama dari iterator adalah nama dari program itu sendiri (ini adalah konvensi di semua OS utama), jadi argumen pertama sebenarnya adalah elemen iterated kedua.
Cara mudah untuk menangani hasilnya args
adalah dengan mengubahnya menjadi Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Anda dapat menggunakan seluruh kotak alat iterator standar untuk bekerja dengan argumen ini. Misalnya, untuk mengambil hanya argumen pertama:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Anda dapat menemukan pustaka di crates.io untuk parsing argumen baris perintah:
println(args[0])
Docopt juga tersedia untuk Rust, yang menghasilkan parser untuk Anda dari string penggunaan. Sebagai bonus di Rust, makro dapat digunakan untuk secara otomatis menghasilkan struct dan melakukan decoding berdasarkan tipe:
Dan Anda bisa mendapatkan argumen dengan:
README dan dokumentasi memiliki banyak contoh yang berfungsi penuh.
Penafian: Saya adalah salah satu penulis perpustakaan ini.
sumber
Rust memiliki
getopt
argumen CLI gaya-parsing di peti getop .sumber
Bagi saya, getop selalu terasa terlalu rendah dan docopt.rs terlalu ajaib. Saya menginginkan sesuatu yang eksplisit dan langsung yang masih menyediakan semua fitur jika saya membutuhkannya.
Di sinilah clap-rs berguna.
Rasanya agak seperti argparse dari Python. Berikut ini contoh tampilannya:
Anda dapat mengakses parameter Anda seperti:
(Disalin dari dokumentasi resmi )
sumber
Pada versi 0.8 / 0.9, jalur yang benar ke fungsi args () adalah
::std::os::args
, yaitu:Tampaknya Rust masih cukup fluktuatif sekarang bahkan dengan IO standar, jadi ini mungkin menjadi usang cukup cepat.
sumber
Rust berubah lagi.
os::args()
tidak digunakan lagistd::args()
. Tetapistd::args()
bukan sebuah array, ia mengembalikan iterator . Anda dapat mengulangi argumen baris perintah, tetapi tidak dapat mengaksesnya dengan subskrip.http://doc.rust-lang.org/std/env/fn.args.html
Jika Anda ingin argumen baris perintah sebagai vektor string, ini akan berfungsi sekarang:
Karat - belajar merangkul rasa sakit karena perubahan.
sumber
env::args().collect()
.apa yang dikatakan @barjak berfungsi untuk string, tetapi jika Anda memerlukan argumen sebagai angka (dalam hal ini uint), Anda perlu mengonversi seperti ini:
sumber
Lihat juga structopt:
https://github.com/TeXitoi/structopt
sumber
Pada versi Rust yang lebih baru (Rust> 0.10 / 11) sintaks array tidak berfungsi. Anda harus menggunakan metode get.[Sunting] Sintaks array berfungsi (lagi) di malam hari. Jadi, Anda dapat memilih antara indeks pengambil atau array.
sumber
Vec
s. Saya kira itu ada di sana selama sebulan atau lebih. Lihat contoh ini .Rust telah berevolusi sejak jawaban Calvin dari Mei 2013. Sekarang orang akan menguraikan argumen baris perintah dengan
as_slice()
:sumber
as_slice()
tidak ada lagi dan&args
harus digunakan sebagai gantinya.The book Rust "Tidak ada stdlib" bab penutup cara mengakses parameter baris perintah (cara lain).
Sekarang, contoh itu juga memiliki
#![no_std]
yang saya pikir berarti bahwa biasanya, perpustakaan std akan memiliki titik masuk yang benar untuk biner Anda dan memanggil fungsi global yang disebutmain()
. Opsi lain adalah 'nonaktifkanmain
shim' dengan#![no_main]
. Yang jika saya tidak salah mengatakan kepada kompiler bahwa Anda mengambil kendali penuh atas bagaimana program Anda dimulai.Saya tidak berpikir ini adalah cara yang 'baik' dalam melakukan sesuatu jika semua yang ingin Anda lakukan adalah membaca argumen baris perintah. The
std::os
Modul disebutkan dalam jawaban lainnya tampaknya menjadi cara yang lebih baik dalam melakukan sesuatu. Saya mengirim jawaban ini demi penyelesaian.sumber