【问题标题】:How to use functions from one file among multiple files?如何在多个文件中使用一个文件中的函数?
【发布时间】:2019-02-10 21:43:54
【问题描述】:

我正在尝试将一个文件中的函数与多个其他文件一起使用。

当我尝试向文件添加“mod somefile”时,Rust 编译器希望它们嵌套在子文件夹中,这不是我想要构建项目的方式,因为这意味着每次都复制文件。

// src/main.rs
mod aaa;
mod bbb;

fn main() {
    aaa::do_something();
    bbb::do_something_else();
}
// src/aaa.rs
mod zzz; // rust compiler wants the file to be nested in a subfolder as aaa/zzz.rs

pub fn do_something() {
    zzz::do_stuff();
}
// src/bbb.rs
mod zzz; // again, compiler wants the file nested in a subfolder as bbb/zzz.rs

pub fn do_something_else() {
    zzz::do_stuff();
}
// src/zzz.rs

pub fn do_stuff() {
    // does stuff here
}

我希望能够将src/zzz.rs 留在根src 文件夹中,并在项目中的任何其他文件中使用其功能,而不必在每个文件的子文件夹中复制它(例如:@ 987654328@, src/bbb/zzz.rs)。

【问题讨论】:

  • 有 2 种不同的思想流派相互竞争。人们没有看到将模块层次结构锁定在文件系统层次结构上的问题,他们甚至认为这是一个好主意。另一流派对此深恶痛绝。 Java(和 rust)遵循以前的学校。因此,在您的情况下,您必须从要在多个其他 crate 中重用的代码构建一个 crate。
  • @BitTickler Java 的包和 Rust 的模块非常不同。除非您将它们与更不同的东西(例如 Python 的模块或 bash 的源文件)进行比较,否则 Java 的包和 Rust 的模块似乎更像是完全相反的。 Java的包是每个目录一个包,包不嵌套,每个文件都属于一个包等。在Rust中,模块嵌套,每个文件可以有多个模块,所以我不明白为什么它们应该属于到同一个“思想流派”?
  • @AndreyTyukin 在文件位置很重要的意义上,它们是。您可能会猜到 - 理所当然地,我并不是真正的粉丝。

标签: rust


【解决方案1】:

mod zzz;main.rs 中只需要一次。

aaa.rsbbb.rs 中,您需要use crate::zzz;,而不是mod zzz;

一个例子:

文件src/aaa.rs

use crate::zzz; // `crate::` is required since 2018 edition

pub fn do_something() {
    zzz::do_stuff();
}

文件src/bbb.rs

use crate::zzz;

pub fn do_something_else() {
    zzz::do_stuff();
}

文件src/main.rs

// src/main.rs
mod aaa;
mod bbb;
mod zzz;

fn main() {
    aaa::do_something();
    bbb::do_something_else();
}

文件src/zzz.rs

pub fn do_stuff() {
    println!("does stuff zzz");
}

只有当您有一个名为aaa 的目录并且在其中有一个文件mod.rszzz.rs 时,您才需要在aaa 模块中添加一个mod zzz;。然后您必须将mod zzz; 放入mod.rs 以使子模块aaa::zzz 对程序的其余部分可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-12
    相关资源
    最近更新 更多