我有一个名为USE_TUTURUS的项目,项目 struct 列在这里.

使用教程(_T)

  • SRC
      • Lib.rs
      • 双手

Lib.rs内容为:

pub trait Draw {
  fn draw(&self);
}

主要内容是:

use crate::Draw;
// use 使用教程(_T)::Draw;
// use super::Draw;
struct SelectBox {
  width: u32,
  height: u32,
  options: Vec<String>
},
impl Draw for SelectBox {
  fn draw(&self) {
    println!("SelectBox draw");
  }
}
fn main() {
  //....
}

When the use statements is use 使用教程(_T)::Draw, it works well. But When the use statements is use crate::Draw or use super::Draw, it doesn't work well. Why?

推荐答案

我认为您可能混淆了 crate 和模块的概念.

您的项目有两个箱子,每个箱子只有一个源代码文件和一个模块:

  • lib.rs被命名为use_tutorial,类型为library.
  • main.rs被命名为bin(我想),它是binary型的.

此外,use_tutorial箱还有一个公共名称Draw,它的全称是use_tutorial::Draw.

因此,当您在二进制箱中写入use use_tutorial::Draw时,正如预期的那样,它工作得很好.

但当您写入use crate::Draw时,它会在当前 crate 的根中查找Draw名称,这就是crate::的意思,但当前 crate 是bin,而那里没有这样的名称,因此出现了错误.

当你为当前模块的超级模块编写use super::Draw个编译器LOO时,但你是在main.rs中编写它的,main.rs是它的箱子的顶部模块,所以super::没有任何意义.

Rust相关问答推荐

如何使用Match比较 struct 中的值

如何在原始字符串中转义";#和#";

创建包含缺失值的框架

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

为什么std repeat trait绑定在impl块和关联函数之间?

Box::new()会从一个堆栈复制到另一个堆吗?

如何点击()迭代器?

Trait bound i8:来自u8的不满意

在Rust中声明和定义一个 struct 体有什么区别

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

为什么这个闭包没有实现Fn?

如何基于常量在Rust中跳过一个测试

有没有办法隐式绑定 let/match 操作的成员?

了解 Rust 闭包:为什么它们持续持有可变引用?

Rust 中的方法调用有什么区别?

如何获取函数中borrow 的切片的第一部分?

为什么 no_std crate 可以依赖于使用 std 的 crate?

传递 Option<&mut T> 时何时需要 mut

在传输不可复制的值时实现就地枚举修改

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?