我有以下代码:
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"));
}
现在,std
可以从任何地方直接访问,因此您显示的代码正在按照预期进行编译。
此外,Rust edition 2018不再需要外部板条箱。向货物添加依赖项。toml
将板条箱名称直接用作顶级标识符。
默认情况下,编译器插入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?(