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

在单独模块中使用未声明的类型或模块“std”

宋耀
2023-03-14

我有以下代码:

pub mod a {
    #[test]
    pub fn test() {
        println!("{:?}", std::fs::remove_file("Somefilehere"));
    }
}

我编译此文件时出错:

error[E0433]: failed to resolve. Use of undeclared type or module `std`
 --> src/main.rs:4:24
  |
4 |         println!("{}", std::fs::remove_file("Somefilehere"));
  |                        ^^^ Use of undeclared type or module `std`

但是,删除内部模块并编译它本身包含的代码运行良好:

#[test]
pub fn test() {
    println!("{:?}", std::fs::remove_file("Somefilehere"));
}

我错过了什么?如果模块位于单独的文件中,我会收到相同的错误:

main.rs

pub mod a;

a.rs

#[test]
pub fn test() {
    println!("{:?}", std::fs::remove_file("Somefilehere"));
}

共有2个答案

沈俊美
2023-03-14

现在,std可以从任何地方直接访问,因此您显示的代码正在按照预期进行编译。

此外,Rust edition 2018不再需要外部板条箱。向货物添加依赖项。toml将板条箱名称直接用作顶级标识符。

麹培
2023-03-14

默认情况下,编译器插入extern crate std;在箱根的开头(箱根是您传递给rustc的文件)。此语句的效果是将名称std添加到板条箱的根命名空间,并将其与包含std板条箱的公共内容的模块相关联。

但是,在子模块中,std不会自动添加到模块的命名空间中。这就是为什么编译器不能在模块中解析std(或任何以std::开头的东西)。

有很多方法可以解决这个问题。首先,您可以添加使用std 使名称std在该模块中指向根std。请注意,在use语句中,路径被视为绝对路径(或“相对于板条箱的根命名空间”),而在其他地方,路径被视为相对于当前命名空间(无论是模块还是函数等)。

pub mod a {
    use std;

    #[test]
    pub fn test() {
        println!("{:?}", std::fs::remove_file("Somefilehere"));
    }
}

您还可以使用use语句导入更多特定项。例如,您可以编写使用std::fs::remove\u文件 。这样,您就不必键入删除\u文件的整个路径,只需直接在该模块中使用名称删除\u文件

pub mod a {
    use std::fs::remove_file;

    #[test]
    pub fn test() {
        println!("{:?}", remove_file("Somefilehere")));
    }
}

最后,您可以避免使用use,方法是在路径前面加上,要求编译器从板条箱的根命名空间解析路径(即将路径转换为绝对路径)。

pub mod a {
    #[test]
    pub fn test() {
        println!("{:?}", ::std::fs::remove_file("Somefilehere"));
    }
}

推荐的做法是直接导入类型(结构、枚举等)。)(例如使用std::rc::Rc;,然后使用路径Rc),但是通过导入它们的函数来使用函数父模块(例如使用std::io::fs;,然后使用pathfs::remove_file)。

pub mod a {
    use std::fs;

    #[test]
    pub fn test() {
        println!("{:?}", fs::remove_file("Somefilehere"));
    }
}

旁注:您还可以在路径的开头写入self::,使其相对于当前模块。这在use语句中更常用,因为其他路径已经是相对的(尽管它们是相对于当前名称空间的,而self::始终是相对于包含模块的)。

 类似资料:
  • 问题内容: 我想将Mongoose模型分离到一个单独的文件中。我试图这样做: 然后,我尝试使用如下模型: 在单独的模块中引用模型是否合理? 问题答案: 基本方法看起来很合理。 作为一种选择,您可以考虑集成模型和控制器功能的“提供商”模块。这样,您可以让app.js实例化提供程序,然后可以执行所有控制器功能。app.js只需指定要实现的具有相应控制器功能的路由即可。 为了进一步整理,您还可以考虑使用

  • 问题内容: 我有一个使用Java Webstart技术的项目。我决定将Java版本从8升级到9。但是,在编译时遇到以下错误: 我试图将其包含到类路径中,但仍然存在相同的问题。 问题答案: 看起来默认情况下,类路径上的代码未解析 java.jnlp (非常类似于Java EE模块 )。解决的办法是用明确添加(两者并接受参数)。 JEP 261:模块系统 或此博客文章中讨论了此选项。

  • 因此,我在工作SOAP客户机示例中使用了SOAP示例,将其放入一个文件,并尝试编译它(Debian上的Openjdk 9): 在谷歌搜索了一些之后,我发现编译和运行 作品。请参阅此视频了解一般背景:https://www.youtube.com/watch?v=y8bpKYDrF5I 现在,问题: 编译器不应该自动添加java模块吗。xml。ws?(因为它显然知道需要它)这是javax中的一个bu

  • use 声明可以将一个完整的路径绑定到一个新的名字,从而更容易访问。 // 将 `deeply::nested::function` 路径绑定到 `other_function`。 use deeply::nested::function as other_function; fn function() { println!("called `function()`"); } mod de

  • 问题内容: 因此,我在WorkingSoap客户端示例中使用SOAP示例,将其放入文件中,然后尝试对其进行编译(Debian上的Openjdk 9): 谷歌搜索了一些之后,我发现编译和运行为 作品。另请参见此视频的一般背景:https : //www.youtube.com/watch?v=y8bpKYDrF5I&t=20m17s 现在,问题: 编译器是否应该自动添加模块java.xml.ws?(