如何在 Rust 中使用父模块导入?

2024-02-19

如果你有这样的目录结构:

src/main.rs
src/module1/blah.rs
src/module1/blah2.rs
src/utils/logging.rs

如何使用其他文件中的函数?

从 Rust 教程来看,听起来我应该能够做到这一点:

main.rs

mod utils { pub mod logging; }
mod module1 { pub mod blah; }

fn main() {
    utils::logging::trace("Logging works");
    module1::blah::doit();
}

日志记录.rs

pub fn trace(msg: &str) {
    println!(": {}\n", msg);
}

blah.rs

mod blah2;
pub fn doit() {
    blah2::doit();
}

blah2.rs

mod utils { pub mod logging; }
pub fn doit() {
    utils::logging::trace("Blah2 invoked");
}

但是,这会产生错误:

error[E0583]: file not found for module `logging`
 --> src/main.rs:1:21
  |
1 | mod utils { pub mod logging; }
  |                     ^^^^^^^
  |
  = help: name the file either logging.rs or logging/mod.rs inside the directory "src/utils"

看来沿着路径导入,即从main to module1/blah.rs作品,并导入同行,即blah2 from blah有效,但从父范围导入则无效。

如果我使用魔法#[path]指令,我可以做到这一点:

blah2.rs

#[path="../utils/logging.rs"]
mod logging;

pub fn doit() {
    logging::trace("Blah2 invoked");
}

我真的必须手动使用相对文件路径从父范围级别导入某些内容吗? Rust 中没有更好的方法吗?

在Python中,你使用from .blah import x对于本地范围,但如果你想访问绝对路径,你可以使用from project.namespace.blah import x.


我也将为其他发现这个问题并且(像我一样)被难以理解的答案完全困惑的人回答这个问题。

归结为我认为教程中解释得不好的两件事:

  • The mod blah;语法为编译器导入一个文件。你必须在要编译的所有文件上使用它.

  • 除了共享库之外,任何定义的本地模块都可以使用以下命令导入到当前作用域中:use blah::blah;.

一个典型的例子是:

src/main.rs
src/one/one.rs
src/two/two.rs

在这种情况下,您可以将代码放在one.rs from two.rs通过使用use:

use two::two;  // <-- Imports two::two into the local scope as 'two::'

pub fn bar() {
    println!("one");
    two::foo();
}

然而,main.rs必须是这样的:

use one::one::bar;        // <-- Use one::one::bar 
mod one { pub mod one; }  // <-- Awkwardly import one.rs as a file to compile.

// Notice how we have to awkwardly import two/two.rs even though we don't
// actually use it in this file; if we don't, then the compiler will never
// load it, and one/one.rs will be unable to resolve two::two.
mod two { pub mod two; }  

fn main() {
    bar();
}

请注意,您可以使用blah/mod.rs文件以在一定程度上缓解尴尬,通过放置类似的文件one/mod.rs, 因为mod x;尝试x.rs and x/mod.rs作为负载。

// one/mod.rs
pub mod one.rs

您可以将 main.rs 顶部的尴尬文件导入减少为:

use one::one::bar;       
mod one; // <-- Loads one/mod.rs, which loads one/one.rs.
mod two; // <-- This is still awkward since we don't two, but unavoidable.    

fn main() {
    bar();
}

有一个示例项目在执行此操作Github https://github.com/shadowmint/rust-starter.

值得注意的是,模块独立于代码块所在的文件;尽管这似乎是加载文件的唯一方法blah.rs是创建一个名为blah,您可以使用#[path]如果出于某种原因需要的话,可以解决这个问题。不幸的是,它似乎不支持通配符,将多个文件中的函数聚合到顶级模块中相当乏味。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rust 中使用父模块导入? 的相关文章

随机推荐

  • 在递归中使用 Prolog 列表

    所以我尝试用递归的方法来寻找两个人之间的路径 这是快速背景 我定义一些事实in X Y 这表明谁是相关的 即 in person1 project1 in person2 project1 等等 现在 如果任何两个人彼此在同一个项目中 或者
  • @ExceptionHandler 不适用于 Spring MVC 3.1 单元测试

    通过在正常 servlet 上下文之外实例化对象 我可以在 Spring MVC 控制器上完成几乎所有单元测试 但我希望能够运行一些测试 以确保我的对象序列化正常工作 正在生成标头等 为了在 servlet 上下文中运行测试 我创建了一个修
  • 如何调用嵌套在 JQuery 插件中的函数?

    我的目标是能够调用 JQuery 插件内的函数 正确的语法是什么 例如 这不起作用 a href Click Me a
  • 如何获取控制器中的请求映射值?

    在控制器中 我有这个代码 不知何故 我想获取请求映射值 搜索 这怎么可能 RequestMapping search public Map searchWithSearchTerm RequestParam name String name
  • OpenXML 2.0 获取错误的单元格值

    我在读取值时遇到了一些问题Excel2010 年工作表 在标准 Excel 2010 工作表上 我有一个具有两位小数的货币格式和值的单元格1270 14 当我在 OpenXML 2 0 C 代码 上读取这个值时 我得到1270 140000
  • 将表单发布到更多 URL

    有没有办法将表单发布到更多网址 我需要它在 JavaScript 中 例如 我有 2 个文档 1 php 和 2 php 我希望表单将数据发布到这两个文件 但转到 1 php 你知道有什么办法吗 您需要一个带有操作 1 php 和 jQue
  • 将上下文菜单添加到 Windows 资源管理器以运行 BAT 文件

    有什么方法可以向 Windows 资源管理器上下文菜单添加一个新条目 该条目可以使用所选文件作为参数来运行 BAT 文件 命令 具体来说 我需要这样做 pscp pw password E File txt email protected
  • 如何使用提供的 url 从 s3 下载文件?

    在我的应用程序中 我将获取 s3 文件的 url 例如 https s3 amazonaws com account update input csv https s3 amazonaws com account update input
  • Buildr 与 Gradle,优缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 JavaScript 中将异步调用与同步调用结合起来

    我开始学习 javascript 并且有一个关于组合同步和异步调用函数的问题 这只是一个理论问题 但我希望它能传达这个想法 假设我们有一个 javascript 程序来决定我需要购买多少香蕉和橙子 console log buy d ban
  • 禁用 nuxt 代码分割。如何将所有内容打包到一个文件中

    我有一个简单的 vue nuxt 项目 我想从 AWS lambda 提供服务 为此 我想将所有内容分组到一个文件中 我看到 Nuxt 正在分割文件 以便仅在给定时间加载重要的内容 但该应用程序是单个页面 供内部使用 加载时间 内存使用情况
  • 在 Linux 的特定位置添加一行并输出到同一个文件?

    如何在 file txt 中添加第三行 line 1 line 2 line 4 sed 可以做sed 3iline 3 file txt但我想输出到同一个文件 我试过sed 3iline 3 file txt gt gt file txt
  • 使用 CSS 替换表格行颜色?

    我正在使用具有替代行颜色的表格 tr d0 td background color CC9999 color black tr d1 td background color 9999CC color black table tr class
  • 更改 Jquery UI Accordion 的动画速度

    我正在使用 Jquery UI Accordion 但我没有在文档中找到有关如何更改动画速度的任何内容 我发现人们建议使用选项 animated bounceslide 但无法找到动画的不同可用选项 我当前的js如下 accordion a
  • 如何从 JAXB 带注释的类生成 JSON 模式?

    我有一个实体类 如下所示 XmlRootElement public class ImageSuffix XmlAttribute private boolean canRead XmlAttribute private boolean c
  • jQuery 倒数计时器 - 倒计时到每个月结束,先开始吗?

    客户想要为他的每月销售进行倒计时 从每个月的第一天开始 服务器时间 本地时间 应该使用的时间 并倒计时到月底 28 天 7 小时 6 分钟 其余的 这背后的逻辑是什么样的 是否有一个库 插件默认执行此操作 任何指向正确方向的指针都会令人惊奇
  • Apache HTTPClient 没有这样的方法 ContentType.create

    我得到的堆栈跟踪是这样的 04 18 36 WARN java lang NoSuchMethodError org apache http entity ContentType create Ljava lang String Lorg
  • Ruby 中的 require_relative 和 require 有什么区别?

    有什么区别require relative and require在鲁比 只要看看docs http ruby doc org core 2 1 2 Kernel html require relative补充内置方法require通过允许
  • 从 PHP 获取 Json 数组

    我是 Android 和 JSON 新手 目前正在尝试从数据库中获取我的数据 但它显示错误 这是我的日志猫 I mytag my json string success 1 message Lecturer s Available lect
  • 如何在 Rust 中使用父模块导入?

    如果你有这样的目录结构 src main rs src module1 blah rs src module1 blah2 rs src utils logging rs 如何使用其他文件中的函数 从 Rust 教程来看 听起来我应该能够做