首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用嵌套模块中的项时,“未解析导入”

使用嵌套模块中的项时,“未解析导入”
EN

Stack Overflow用户
提问于 2016-03-26 01:18:31
回答 1查看 1.6K关注 0票数 2

我有一个小程序,我一直在努力工作,但我总是收到未解决的导入消息。

main.rs:

代码语言:javascript
运行
复制
mod sub_module;
use sub_module::a_structure;

fn main() {
    let x: a_structure = /* init code */;
}

sub_module.rs:

代码语言:javascript
运行
复制
pub mod sub_sub_module;

pub use sub_sub_module::a_structure;

sub_sub_module.rs:

代码语言:javascript
运行
复制
pub struct a_structure<T> {
    some_field: i32,
}

但是,在执行cargo build时,我会得到一个“未解决的导入sub_sub_module::a_structure”。我发现的所有关于可视性的东西都说,这应该是可行的,但是它不起作用。我在这里遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-26 01:56:27

把锈蚀模块想象成一个目录树。模块是目录,其他的都是文件1,::基本上是/

所以,你有这样的结构:

代码语言:javascript
运行
复制
/ (crate root)
 └┬─ sub_module
  │   └┬─ sub_sub_module
  │    │   └── a_structure
  │    └─ a_structure [x]
  ├─ a_structure
  └─ main

问题在于如何定义a_structure [x]“符号链接”。正如书中所解释的, paths in Rust are absolute,这意味着在这个类比中,它们都隐式地以/开头。这意味着use sub_sub_module::a_structure指的是不存在的/sub_sub_module/a_structure

解决方案是通过显式地使用self (有效的.)或super (有效的..)启动路径来使用相对路径。您需要./sub_sub_module/a_structure,所以锈蚀中的路径应该是self::sub_sub_module::a_structure。完整的编译(带有警告)示例如下所示:

代码语言:javascript
运行
复制
mod sub_module {
    pub mod sub_sub_module {
        pub struct a_structure {
            some_field: i32,
        }
    }

    pub use self::sub_sub_module::a_structure;
}

use sub_module::a_structure;

fn main() {
    let x: a_structure = panic!("TODO");
}

您还应该注意,在use之外的任何地方使用的路径都有完全相反的默认值:默认情况下它们相对于包含的模块。如果在这种情况下需要绝对路径,则需要使用:: (就像文件系统路径(默认情况下解释为相对路径)一样)显式地请求路径。

旁白:传统的样式是使用PascalCase作为类型名称。另外,我不得不删除类型参数,因为它没有被使用。

他说:事实上,这是一个谎言,因为你可以拥有与其他物品相关的物品。例如,关联的const虽然不稳定,但却是一回事。我想你可以从资源叉之类的角度来看待它们,我不知道,这只是个比喻!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36230543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档