在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Rust的標準庫和structopt庫來處理控制臺參數

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-20 11:13 ? 次閱讀

Rust是一種安全、高效的系統編程語言,其標準庫以及外部庫提供了很多處理控制臺參數的方式。在本篇文章中,我們將分別介紹如何使用Rust的標準庫處理控制臺參數,以及如何使用structopt庫處理控制臺參數。我們還將介紹如何使用structopt處理復雜結構參數,并且提供相應的示例代碼。

處理控制臺參數

Rust標準庫提供了處理控制臺參數的方式,主要基于三個模塊:std::env、std::process和std::os::unix。在下面的例子中,我們將展示如何使用這些模塊來處理控制臺參數:

use std::env;

fn main() {
    let args: Vec< String > = env::args().collect();

    println!("program name is {}", args[0]);

    for arg in args.iter().skip(1) {
        println!("Argument: {}", arg);
        match arg.as_str() {
            "-v" = > println!("version is xxx"),
            "-h" = > println!("Help message"),
            _ = > println!("Unknown argument: {}", arg),
        }
    }
}

在這個例子中,我們使用了std::env::args函數來獲取命令行參數,該函數返回一個迭代器,我們需要將其轉換為一個向量來方便地處理。接下來,我們使用'iter'函數和命令行參數向量創建一個迭代器。我們執行了'as_str'函數將迭代器值轉換為其引用,我們再次使用match語句對參數進行篩選,并顯示相應的消息。

在處理控制臺參數時,我們通常需要定義一組選項和參數,這些選項和參數可以通過命令行傳遞給程序。很明顯假如我們僅使用標準庫提供的API手動解析命令行參數,會非常耗時且麻煩。萬幸的是,Rust社區提供了開源的structopt庫來幫助我們解析。

使用structopt庫處理控制臺參數

structopt庫提供了一種定義命令行選項和參數的方式,并自動生成解析代碼的方法。它使用#[derive]屬性來自動生成解析代碼,這使得處理控制臺參數變得非常簡單。

首先,我們需要將structopt庫添加到我們的Cargo.toml文件中:

[dependencies]
structopt = "0.3.21"

然后,我們可以使用#[derive]來創建一個結構體,用于定義程序的所有選項和參數。例如,下面的代碼定義了一個結構體,其中包含一個字符串參數和兩個布爾選項:

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(parse(from_os_str))]
    filename: std::path::PathBuf,
    #[structopt(short = "v", long = "verbose")]
    verbose: bool,
    #[structopt(short = "f", long = "force")]
    force: bool,
}

在上面的代碼中,我們使用#[derive(StructOpt)]屬性來告訴structopt庫自動生成解析代碼。我們還定義了三個字段:一個路徑參數filename,以及兩個布爾選項verboseforce。在這里,我們將filename字段標記為parse(from_os_str),以便自動將其轉換為PathBuf類型。

接下來,我們可以在程序的main函數中使用Opt::from_args()函數來解析命令行參數并獲取我們定義的選項和參數:

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(parse(from_os_str))]
    filename: std::path::PathBuf,
    #[structopt(short = "v", long = "verbose")]
    verbose: bool,
    #[structopt(short = "f", long = "force")]
    force: bool,
}

fn main() {
    let args = Opt::from_args();
    println!("{:?}", args);
}

上面的代碼將打印出程序的所有選項和參數,例如,如果我們運行./main -v -f /path/to/file.txt,則輸出將是Opt { filename: "/path/to/file.txt", verbose: true, force: true }

structopt庫還提供了許多其他選項和參數,例如子命令、默認值和驗證函數等。有關更多詳細信息,請參見官方文檔。

structopt處理復雜結構參數

在處理控制臺參數時,我們通常需要處理一些復雜的結構參數,例如具有嵌套字段的結構體或向量。在這種情況下,我們可以使用structopt庫的#[structopt(flatten)]#[structopt(skip)]屬性來解決問題。

首先,讓我們考慮一個具有嵌套字段的結構體。例如,下面的代碼定義了一個包含名稱、年齡和地址的人員結構體,其中地址包含城市、州和國家等嵌套字段:

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Address {
    city: String,
    state: String,
    country: String,
}

#[derive(Debug, StructOpt)]
struct Animal {
    name: String,
    age: u8,
    #[structopt(flatten)]
    address: Address,
}

fn main() {
    let args = Animal::from_args();
    println!("{:?}", args);
}

在上面的代碼中,我們使用#[structopt(flatten)]屬性將Address結構體的字段展開到Animal結構體中。現在,我們可以將Animal結構體作為命令行參數傳遞給程序:

$ ./main --name Tom --age 30 --city Chengdu --state Chengdu --country China

上面的命令將創建一個Animal結構體,其中包含名稱為Tom、年齡為30歲、地址為北京市、北京市、中國的人員信息。

接下來,讓我們考慮一個包含向量字段的結構體。例如,下面的代碼定義了一個包含名稱、年齡和朋友列表的人員結構體:

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Animal {
    name: String,
    age: u8,
    #[structopt(skip)]
    friends: Vec< String >,
}

fn main() {
    let args = Animal::from_args();
    println!("{:?}", args);
}

在上面的代碼中,我們使用#[structopt(skip)]屬性將friends字段跳過,因為我們將使用自定義代碼來處理它。現在,我們可以將Animal結構體作為命令行參數傳遞給程序:

$ ./main --name Tom --age 30 --friends Bob --friends Charlie --friends Dave

上面的命令將創建一個Animal結構體,其中包含名稱為Tom、年齡為30歲、朋友列表包含Bob、Charlie和Dave的人員信息。我們還需要手動將命令行參數中的朋友列表轉換為向量字段。我們可以使用std::iter::FromIterator trait來將命令行參數轉換為向量字段:

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Animal {
    name: String,
    age: u8,
    #[structopt(skip)]
    friends: Vec< String >,
}

impl Animal {
    fn from_args() - > Self {
        let mut args = Vec::from_iter(std::env::args());
        let friends = args
            .iter()
            .enumerate()
            .filter_map(|(i, arg)| if i > 0 && args[i - 1] == "--friends" { Some(arg) } else { None })
            .map(|arg| arg.to_owned())
            .collect();
        let args = Animal::clap().get_matches_from(args);
        let name = args.value_of("name").unwrap().to_owned();
        let age = args.value_of("age").unwrap().parse().unwrap();
        Animal { name, age, friends }
    }
}

fn main() {
    let args = Animal::from_args();
    println!("{:?}", args);
}

上面的代碼使用std::env::args()函數獲取命令行參數,并使用Vec::from_iter()函數將其轉換為向量。然后,我們使用filter_map()函數和enumerate()函數來獲取命令行參數中的朋友列表。接下來,我們使用std::iter::FromIterator trait將朋友列表轉換為向量,并將其存儲在friends字段中。最后,我們使用Animal::clap().get_matches_from()函數來解析其他選項和參數,并使用nameage字段創建一個Animal結構體。

結論

在本教程中,我們介紹了如何使用Rust的標準庫和structopt庫來處理控制臺參數。我們討論了處理簡單參數和選項的方法,以及處理復雜結構參數的方法。structopt庫提供了一種簡單而強大的方式來定義命令行選項和參數,并自動生成解析代碼。如果您需要處理控制臺參數,那么structopt庫是您的最佳選擇。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2707

    瀏覽量

    47473
  • 參數
    +關注

    關注

    11

    文章

    1834

    瀏覽量

    32220
  • 編程語言
    +關注

    關注

    10

    文章

    1945

    瀏覽量

    34736
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68612
  • Rust
    +關注

    關注

    1

    文章

    228

    瀏覽量

    6609
收藏 人收藏

    評論

    相關推薦

    如何在Rust中連接和使用MySQL數據

    MySQL是一個廣泛使用的關系型數據Rust作為一門相對較新的系統級編程語言,具有C語言般的高性能、安全、并發等特性,因此與MySQL一起使用是一種非常有趣的選擇。在本教程中,我們將手把手地展示
    的頭像 發表于 09-30 17:05 ?1674次閱讀

    如何利用C語言去調用rust靜態

    新語言的感覺,要做不少的對接工作。也用過Lua,感覺也差不多。評估學習評估Rust語言時,感覺性能和體積應該都不會有太大的問題。加上語言本身主打的安全性,再結合一些,用來做一些C語言不擅長的動態操作
    發表于 06-21 10:27

    SCVMM 2008 R2管理控制臺介紹

    /SCSI硬盤配置等。根據企業生產環境中存在的或是將要上線的業務系統的不同要求,可以創建多個硬件配置文件,從而實現不同類型業務虛擬機的硬件標準化。打開VMM R2的管理員控制臺,導航至,并在左上的視圖
    發表于 10-24 16:55

    Rust代碼中加載靜態時,出現錯誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    我正在 MCUXpresso IDE 中創建一個靜態。我正在使用 redlib 在我的代碼中導入 ` [i]stdlib.h`。它成功地構建了一個靜態。但是,靜態中未定義一些標準
    發表于 06-09 08:44

    dmx512控制臺是什么_dmx512控制臺按鍵說明

    DMX512控制臺是什么?DMX512控制臺的按鍵又有哪些? DMX512控制臺定義 控制臺是存放管理工具的框架,包括文件夾和其他容器、網頁和其他管理項。
    發表于 11-07 11:20 ?2.7w次閱讀

    SU RUBy控制臺如何使用?SU RUBy控制臺的一個應用實例說明

    本文檔的主要內容詳細介紹的是SU RUBy控制臺如何使用?SU RUBy控制臺的一個應用實例說明。
    發表于 09-27 16:04 ?0次下載

    Rust GUI 發展現狀

    Rust GUI 發展現狀 最近有一篇關于 Rust GUI 的博客,這不,kas?這個? Another GUI toolkit ?框架也針對 Rust 的 GUI 框架現狀進行了
    的頭像 發表于 12-21 15:00 ?2639次閱讀

    什么是數據

    在RDS控制臺,創建數據、高權限賬號以及將賬號賦予數據權限
    的頭像 發表于 02-20 16:07 ?1444次閱讀
    什么是數據<b class='flag-5'>庫</b>

    基于Rust的Log日志介紹

    Rust是一門系統級編程語言,因其安全性、高性能和并發性而備受歡迎。在Rust應用程序中,日志記錄是一項非常重要的任務,因為它可以幫助開發人員了解應用程序的運行情況并解決問題。Rust的Log
    的頭像 發表于 09-19 14:49 ?3485次閱讀

    Rust標準的功能劃分

    對于大部分軟件開發工程師而言,他們用Rust主要開發應用層軟件,也就是運行在用戶空間的程序。它們基于標準編寫,實現各種業務功能。應用層的軟件并非所有模塊和函數都涉及到系統調用(例如一些用于操作字符串和
    的頭像 發表于 10-29 17:17 ?1290次閱讀
    <b class='flag-5'>Rust</b>的<b class='flag-5'>標準</b><b class='flag-5'>庫</b>的功能劃分

    FastTime-純Rust編寫的高并發快速時間

    FastTime, 純Rust編寫的快速時間, 并發: 2800萬+/秒. 一、組件
    的頭像 發表于 11-06 09:23 ?641次閱讀

    weblogic控制臺配置jvm參數

    將詳細介紹如何在WebLogic控制臺中配置JVM參數,并提供一些常見的配置建議。 首先,我們需要了解JVM參數對應的不同類型。JVM參數可以分為
    的頭像 發表于 12-05 14:48 ?2816次閱讀

    基于Rust的嵌入式符合ACID的鍵值數據

    surrealkv -- 基于 Rust 的 low level、版本化、嵌入式、符合 ACID 的鍵值數據
    的頭像 發表于 12-28 11:29 ?884次閱讀

    火語言RPA如何建立控制臺應用

    火語言通過軟件自帶的豐富的顆粒組件,開發出滿足各種需求的應用。火語言中的應用分為兩種常見類型,界面應用以及控制臺應用。 下面詳細介紹下控制臺應用的定義以及構建方法。 控制臺應用
    的頭像 發表于 08-15 09:24 ?407次閱讀
    火語言RPA如何建立<b class='flag-5'>控制臺</b>應用

    控制臺窗口主機是什么

    主機是Windows操作系統中的一個系統進程,它負責管理和控制控制臺窗口的顯示和行為。 功能 : 承載控制臺窗口:conhost.exe進程是控制臺窗口的宿主進程,它負責創建和顯示
    的頭像 發表于 10-08 18:12 ?2078次閱讀
    主站蜘蛛池模板: 热re99久久精品国产99热| 流不尽奶水的大乳h| 免费视频在线看| 亚洲一区二区三区中文字幕| 黄网站色在线视频免费观看| 五月天丁香花婷婷| 老师今晚让你爽个够| 日韩免费看| 国产一级特黄毛片| 天天舔天天色| 性xxxxhd高清| www.一区二区三区| 三级黄网站| 国语自产拍在线观看7m| 午夜国产精品视频| 在线h网站| 四虎国产精品免费入口| 黄a网站| 天天干天天拍天天射天天添天天爱| 777精品视频| 伊人亚洲| 男人和女人做a免费视频| aa看片| 91精品国产色综合久久不卡蜜| 亚洲人在线| 久草婷婷| 日本黄色大全| 视频二区中文字幕| 色我网站| 1000部啪啪勿入十八免费| 操操操插插插| 综合色久| 久久久久久久国产精品电影| 天天天天干| 中国一级做a爰片久久毛片| 国产一级特黄aa大片爽爽| 欧美性网站| 四虎最新免费网址| 国产精品伦视频观看免费| 久草一本| 亚洲色图综合图区|