Rust *准确地*如何查找模块?

2023-12-05

Rust 用于从文件中查找模块的确切规则集是什么?

我在网上找到的关于模块的每一个解释都说:“这是模块的目的,这是一个例子,……”没有一个给出完整、全面、100%准确的解释Rust 如何查找模块。就连铁锈参考没有告诉您板条箱根和导入文件是否都需要声明mod!没有简单的规则集可以用来判断它是否有效。

我在找东西I可以遵循,例如:

  1. Rust 看名字,解析:: like subdir::subdir::name
  2. Rust 查看是否有文件name.rs在同一目录中并且name/mod.rs
  3. 不允许同时存在name.rs and a name/mod.rs.
  4. 然后,鲁斯特...???

这最好从内联模块开始解释。模块从 crate 根开始按层次结构排列。每个板条箱在脱糖后看起来都是这样的:

// root

pub mod a {
    pub mod b {
        pub const X: u8 = 1;
    }
}

mod foo {
    
}

引用树中的项目非常简单:

  • ::“下降”一个级别
  • super::“上升”一个层次
  • crate::转到根级别

可供参考的例子X:

  • a::b::X从板条箱根部开始
  • crate::a::b::X从板条箱中的任何地方
  • super::a::b::X从模块内foo
  • b::X从模块内a

mod foo;实际上只是以下任一内容的语法糖:

#[path = "foo.rs"]
mod foo;
// or
#[path = "foo/mod.rs"]
mod foo;

进一步脱糖:

mod foo {
    include!("foo.rs");
}
// or
mod foo {
    include!("foo/mod.rs");
}

If foo.rs (or foo/mod.rs)包含一个mod bar;那么整棵树看起来像:

mod foo {
    mod bar {
        // contents of `bar.rs` (or `foo/bar/mod.rs`)
    }

    // remaining contents of `foo.rs`
}

请注意,使用mod.rs虽然仍受支持,但不鼓励。相反,建议使用foo.rs for crate::foo并放置任何子模块foo in the foo/目录。

If both src/foo/mod.rs and src/foo.rs存在的话,编译器会抛出如下错误:

error[E0761]: file for module `foo` found at both "src\foo.rs" and "src\foo\mod.rs"
 --> src\main.rs:1:1
  |
1 | mod foo;
  | ^^^^^^^^
  |
  = help: delete or rename one of them to remove the ambiguity

crate::总是对应于当时正在编译的包的根模块。如果您的板条箱足够复杂或不遵循惯例,那么某些crate::...项目路径可以引用不同文件中的不同内容。但通过遵循约定可以轻松避免混淆。

以下是我用来避免混淆的约定列表:

  • avoid #[path]属性
  • 总是使用src/foo.rs代替src/foo/mod.rs
  • 如果您有多个根模块(例如库和二进制板条箱),它们都应该直接位于src
  • 最小化花哨的配置Cargo.toml,尽可能使用默认值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust *准确地*如何查找模块? 的相关文章

随机推荐

  • 如何创建右上角带有完成按钮的 UIKeyboard?

    我需要展示UIKeyboard右上角有 完成 按钮 请查看附图 任何帮助将不胜感激 这可能对你有帮助 请检查一下BS键盘控制
  • C# 自定义组合框排序

    是否可以在组合框中自定义排序 显示顺序 假设我在所有其他值之前想要一个特殊值 MasterValue 不要添加字符串 而是创建一个实现 IComparable 并重写 ToString 的类 将该类的实例添加到您的 ComboBox
  • 将 SMS api 与 woocommerce 集成,不发送消息

    我正在将 SMS API 与 WooCommerce 集成 以便每当在现场进行任何购买时都会向客户的手机发送自动订单更新 下面是我的代码 add action woocommerce payment complete custom proc
  • 如何使用宏将数字格式化为文件名中至少有 5 位数字?

    我正在开发一个宏 其中涉及生成文件名并将 Excel 工作表保存为具有该名称的 pdf 我能够生成目标文件夹名称 如下所示 user name Environ UserName file dir C Users user name Docu
  • 为什么 JSON.parse 会因空字符串而失败? [复制]

    这个问题在这里已经有答案了 为什么 JSON parse 产生错误 Uncaught SyntaxError Unexpected end of input 如果直接返回不是更符合逻辑吗null 编辑 这不是链接问题的重复 虽然最小有效 j
  • Perl 正则表达式:剪切和粘贴

    我正在尝试使用 perl 编辑文件 本质上是剪切和粘贴文件中的内容 但是 看来我错误地构建了正则表达式 我很乐意帮助解决它 替换命令shouldcut 剪切之后的内容export PATH PATH直到但是not包括 THIS IS LAS
  • R - 多个嵌套循环

    我正在尝试编写一个嵌套循环代码来模拟 101 行数据框中的 10 列数据 第一行数据已被指定为起始值 每列应该不同 因为我的矩阵 r 是从随机法线生成的 但是 每列中的结果值完全相同 为循环索引提供一些上下文 tmax 100 ncol p
  • 在 Windows 8 上使用 gem 安装 SASS

    我尝试在 Windows 8 x64 上安装 SASS 但即使防火墙已关闭 仍然出现错误 我发出这个命令 C Ruby200 x64 bin gt gem install sass or C Ruby200 x64 bin gt ruby
  • Bootstrap 滑动选项卡(不是选项卡内容)

    我正在开发一个项目并使用 Bootstrap Tabs 作为我的选项卡 用户可以创建新选项卡 因此问题是 超过N选项卡 其中N取决于浏览器的宽度 导致此行为 我浏览了一下 Bootstrap HTML 选项卡代码 选项卡是li里面的元素ul
  • 如何获取客户端的计算机名称

    我在另一篇文章中看到了这个问题 但解决方案无法正常工作 我用 System Net Dns GetHostEntry HttpContext Current Request ServerVariables Item REMOTE HOST
  • 在 Tkinter 中向按钮添加图像

    我正在尝试将图像添加到按钮 但是当我尝试执行当前代码时遇到一些问题 它所显示的只是一张没有文字的图像 我也看不到按钮 有什么方法可以修复我当前的代码吗 from tkinter import import tkinter as tk roo
  • 发送意图的进程的 Pid

    我正在尝试发现向我发送意图的进程的进程 ID 或包名称 我不想将进程 ID 或包名称放在额外的内容中 正如其他一些问题所要求的那样 因为我不想允许欺骗 我使用的代码是 Override public void onCreate Bundle
  • 为什么session[:]在grape-rails中不起作用?

    我使用 Rails 和 Grape 作为 API 我只是好奇为什么没有session something 葡萄的方法 我可以创建 cookie 但也无法创建签名 cookie 它给我一个错误 Grape 是一个用于构建 API 的轻量级框架
  • 主屏幕网络应用程序的 Facebook 身份验证已损坏!+

    使用元名称 apple mobile web app capable 内容 yes 删除所有移动 safari ui 时 Facebook connect js js api 无法与主屏幕 web 应用程序一起使用 经过身份验证后 我会看到
  • 从活动之外的类启动意图

    我有两项活动 其中一项称为MyActivity 我希望他们都能够使用位于我们可以调用的类中的函数MyClass In MyClass 我尝试使用意图来启动活动AnotherActivity 由于构造函数采用上下文作为参数 因此我只是尝试在构
  • Hibernate @Version 注释

    hibernate version 和 ManyToOne Mapping 之间的关系是什么 假设我有两个表 部门 和 员工 这是部门是主表 和明细表中的员工 在 Employee 表中 部门 ID 作为外键引用 这是我的课程 Public
  • 在 PowerShell 上将节点从一个 XML 导入到另一个 XML

    我需要将名称为 ProjectOptions 的节点从default xml 复制到original xml 而不修改任何其他内容 原始 xml
  • 如何将 Google 数据存储用于未托管在 Google 应用引擎中的网络应用?

    我想在我的网络应用程序中使用谷歌的数据存储 但不想将其托管在谷歌应用程序引擎中 我想将其托管在其他机器上 那么我如何在这样的网络应用程序中使用数据存储 会更经济吗 您需要遵循从其他平台访问 Cloud Datastore API程序 本部分
  • 列表的 ViewModel 验证

    我有以下视图模型定义 public class AccessRequestViewModel public Request Request get private set public SelectList Buildings get pr
  • Rust *准确地*如何查找模块?

    Rust 用于从文件中查找模块的确切规则集是什么 我在网上找到的关于模块的每一个解释都说 这是模块的目的 这是一个例子 没有一个给出完整 全面 100 准确的解释Rust 如何查找模块 就连铁锈参考没有告诉您板条箱根和导入文件是否都需要声明