当前位置: 首页 > 知识库问答 >
问题:

当存在main.rs和lib.rs时,Rust模块混乱

刘泰
2023-03-14

我有4个文件:

main.rs

mod bar;

fn main() {
    let v = vec![1, 2, 3];
    println!("Hello, world!");
}

lib.rs

pub mod foo;
pub mod bar;

pub fn say_foo() {

}

use crate::foo;

fn bar() {
    foo::say_foo();
}

error[E0432]: unresolved import `crate::foo`
 --> src/bar.rs:1:5
  |
1 | use crate::foo;
  |     ^^^^^^^^^^ no `foo` in the root
[package]
name = "hello-world"
version = "0.1.0"
authors = ["me@mgail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

共有1个答案

拓拔意
2023-03-14

让我们从头开始。请看货物书中的包装布局章节。如您所见,您的包可以包含很多东西:

  • 一个二进制文件(可以运行的东西)或多个二进制文件,
  • 单个库(共享代码),
  • 示例
  • 基准,
  • 集成测试。

这里没有列出所有的可能性,只有二进制/库组合。

这是一个带有单个二进制文件的包的例子。入口点是src/main.rs中的main函数。

cargo.toml:

[package]
name = "hallo"
version = "0.1.0"
edition = "2018"

src/main.rs:

fn main() {
    println!("Hallo, Rust here!")
}
$ cargo run
Hallo, Rust here!
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
pub fn foo() {
    println!("Hallo, Rust library here!")
}
$ cargo run
error: a bin target must be available for `cargo run`

您在cargo.toml文件中看到任何关于二进制文件或库的内容吗?不是。原因是我遵循了包的布局,而货物知道在哪里寻找东西。

这是一个包含二进制文件和库的包的示例。

cargo.toml:

[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
pub const GREETING: &'static str = "Hallo, Rust library here!";
use hallo::GREETING;

fn main() {
    println!("{}", GREETING);
}
    null

可以通过use hallo::...从二进制文件引用库,其中hallo是这个包名(cargo.toml->[package]->name)。

cargo.toml:

[package]
name = "hallo"
version = "0.1.0"
edition = "2018"

src/lib.rs:

pub mod bar;
pub mod foo;
pub fn say_foo() {
    println!("Foo");
}

src/bar.rs:

use crate::foo;

pub fn bar() {
    foo::say_foo();
}

crate引用src/lib.rs,因为我们在这里处于库的上下文中。

将其视为一个独立的单元,并通过use hallo::...;从外部引用它。

use hallo::bar::bar;

fn main() {
    bar();
}

相同的代码,但是lib.rs被重命名为utils.rs(foobar).rs文件被移动到src/utils/文件夹。

src/utils.rs:

pub mod bar;
pub mod foo;

src/utils/foo.rs:

pub fn say_foo() {
    println!("Foo");
}
use super::foo;
// or use crate::utils::foo;

pub fn bar() {
    foo::say_foo();
}

src/main.rs:

use utils::bar::bar;

mod utils;

fn main() {
    bar();
}

这里我们只是声明了另一个模块(utils),我们正在使用它。

cargo.toml内容:

[package]
name = "hallo"
version = "0.1.0"
edition = "2018"
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"

[[bin]]
name = "hallo"
src = "src/main.rs"
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"

[lib]
name = "hallo"
path = "src/lib.rs"
[package]
name = "hallo"
version = "0.1.0"
edition = "2018"

[[bin]]
name = "hallo"
path = "src/main.rs"

[lib]
name = "hallo"
path = "src/lib.rs"
    null
 类似资料:
  • 本文向大家介绍Rust Impl块,包括了Rust Impl块的使用技巧和注意事项,需要的朋友参考一下 示例 这指定Type具有生命周期'a,并且由于结束不再存在,由返回的引用my_function()在'a结束后可能不再有效。Typeself.x

  • 有一个只有exports子句的src/main/java/module-info.java。 有一个src/test/java/example/sometest/addertest,它具有: 到目前为止还不错。现在我使用@ExtendWith注释。 哪里 现在mvn测试给出错误 [警告].../AdderTest.java:[9,2]未导出模块中的类org.junit.jupiter.api.ex

  • 在将中缀表达式转换为后缀表达式的上下文中,使用分流码算法。我想使用一个向量来存储输出,它将存储运算符和数字类型数据。 上面的代码当然不会编译,因为方法没有为定义。我看到两种方法来修复它: 定义 方法 创建一个向量来存储对数字和的引用。 我认为第二个是首选,尽管我不知道创建引用向量是否会带来很多复杂性。

  • 我试图从另一个模块调用属于某个模块的函数(用于代码分解、组织等)。 在这一点上,一切都好了。 、、bin/one.rs工作中添加的。 > 编辑:我已经在Linux 5.3.0-45上安装了:。 编辑2:每当使用关键字时,我都会从中得到一个神秘的错误: 我在任何地方都找不到任何故障排除方法。 > 编辑3:在中添加文件,声明模块结构,并编写在中工作,但是: 2)我必须在两个不同的地方复制完全相同的信息

  • Rust有两个与模块 (module) 系统相关的独特术语:crate和module, 其中包装箱 (crate) 与其它语言中的 libary 或者 package 作用一样。 每个包装箱都有一个隐藏的根模块,在根模块下可以定义一个子模块树, 其路径采用::作为分隔符。包装箱由条目 (item) 构成,多个条目通过模块组织在一起。 定义模块 使用mod关键字定义我们的模块: // in src/

  • 问题内容: 我是Maven的新手。我从SVN签出了具有以下结构的客户项目: “ projectName”下方的pom.xml(顶部的pom)正在构建三个模块 但是从文件夹执行时会出现以下错误 问题是:就像我的客户可能忘记使用SVN的其余模块一样,下面是否应该有pom.xml ? 问题答案: 问题是:是否应该在projectName-war下面有pom.xml 简单地说 是 。 您已经找到了窍门,并