【问题标题】:What does `::parse()` do on a struct?`::parse()` 在结构上做了什么?
【发布时间】:2021-08-19 08:07:44
【问题描述】:

我正在学习 rust,而学习编程语言的最佳方式显然是阅读和理解他人的代码。现在我面对这条线,即使在阅读了文档、其他源文件和谷歌搜索之后我也无法理解:

zoxide's主文件中,有这一行:

if let Err(e) = App::parse().run() { ... }

App::parse() 是什么意思? App 是一个结构而不是一个变量,所以我明白为什么它不是.parse(),但为什么是::parse(),它有什么作用? (我在app's 源代码中找不到它的定义(在this file) 中也找不到)

【问题讨论】:

  • 对我来说它看起来像这样:在 app/_app.rs 中,clap 宏(来自 the clap library 用于 App,它添加了 parse 函数。调用然后使用App::parse() 来触发命令行的解析。(我不太了解Rust,所以我对这个解释的细节没有足够的信心来从中创建答案。)
  • docs.rs/clap/3.0.0-beta.4/clap/trait.Clap.html#method.parse>
  • @CherryDT 恭喜,对于那些不太了解 Rust 的人来说,你做得非常好!
  • @user4815162342 原来我错了,因为 derive(Clap) - 我错过了 - 负责它,而不是 clap 宏。

标签: rust


【解决方案1】:

首先,您提到的两个文件都不是 zoxide 包含的App。 zoxide 的main.rs 文件说use crate::app::{App, Run};,所以它包括来自src/app/mod.rsApp,它从src/app/_app.rs 导出App

在那个文件中,我们可以看到App的声明:

#[derive(Debug, Clap)]
#[clap(
    bin_name = env!("CARGO_PKG_NAME"),
    about,
    author,
    after_help = ENV_HELP,
    global_setting(AppSettings::ColoredHelp),
    global_setting(AppSettings::DisableHelpSubcommand),
    global_setting(AppSettings::DisableVersionForSubcommands),
    global_setting(AppSettings::PropagateVersion),
    version = option_env!("ZOXIDE_VERSION").unwrap_or_default()
)]
pub enum App {
    Add(Add),
    Import(Import),
    Init(Init),
    Query(Query),
    Remove(Remove),
}

本例中的密钥是#[derive(Clap)]。如果您查看the clap crate,您会发现它是一个用于解析命令行参数的板条箱,并且从Clap 派生的结构中添加了一个parse 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2021-03-24
    相关资源
    最近更新 更多