【问题标题】:rust modules resolution from main.rs来自 main.rs 的 rust 模块解析
【发布时间】:2021-04-20 10:53:34
【问题描述】:

我有一个关于 rust 模块解析的问题。 似乎在板条箱模块内部,我可以使用板条箱名称或 crate/super/self 关键字来引用其他模块。 但是在main.rs 中我只能使用带有 crate 名称的模块?

我在这里做了什么蠢事吗?

我的项目:

$ tree
.
├── Cargo.toml
└── src
    ├── add2.rs
    ├── add.rs
    ├── lib.rs
    └── main.rs

Cargo.toml内容:

[package]
name = "example"
....

main.rs内容:

use example::add::{add_one};
fn main() {
    println!("{}", add_one(1));
}

lib.rs内容:

pub mod add;

add.rs内容:

pub fn add_one(x: i32) -> i32 {
    x + 1
}

add2.rs内容:

use crate::add::{add_one};

pub fn add_two(x: i32) -> i32 {
    add_one(add_one(x))
}

【问题讨论】:

标签: rust


【解决方案1】:

我在这里做了什么蠢事吗?

不,只是 Cargo 增加了一层称为“包”的复杂性,无论好坏,这使它更加混乱。

简而言之,您的 Cargo 包包含两个 Rust crate:二进制包和库包。当您在 main.rs 中时,example 库 crate 与任何其他库一样都是外部依赖项...这意味着您不在同一个 crate 中!

【讨论】:

  • 我在关注stackoverflow.com/questions/65735609/… 这本书,模块/板条箱非常混乱......
  • 是的,这是本书最糟糕的部分之一。我已经编程了几十年,使用了十几种语言,但它仍然让我感到困惑。
【解决方案2】:

模块系统对 main.rslib.rsbin/other_root.rs 等 Crate 根的处理方式不同。当它们引用模块文件时,它们仅引用 src/ 目录的根目录中的文件。在正常情况下,mod 指的是本地子目录的根目录中与包含文件同名的文件,反映了内联模块布局的唯一容器约束以及文件系统层次结构(除了链接文件,当然)。本质上,就mod 而言,crate 根将src/ 视为其本地子目录。

I gave perhaps a more wordy explanation here

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2017-01-12
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多