当我使用另一个模块的结构时导入了什么?

时间:2016-07-13 06:04:07

标签: rust

我有模块 mod1.rs

pub struct Foo;

impl Foo {}

impl Drop for Foo {
    fn drop(&mut self) {}
}

file2.rs 中,我写了use mod1::Foo;

  1. 我在 file2.rs 中实际拥有什么?只有struct Fooimpl Foo?那么impl Drop for Foo呢?

  2. 如果我在 file2.rs 中获得Foo的所有特征,我会写 fn my_func(foo: Foo)...,我在这里有什么? Foostruct还是特质(impl Foo)?

  3. 我阅读了Rust的书和手册,但他们只是解释 显式用法,不提及trait具有相同名称(impl)的情况。 Rust书籍告诉您明确导入特征,如果是,Drop未导入use mod1::Foo,这真的非常糟糕。

1 个答案:

答案 0 :(得分:4)

  

file2.rs 中,我写了use mod1::Foo;

     

我在 file2.rs 中实际拥有什么?只有struct Fooimpl Foo?那么impl Drop for Foo呢?

当您use类型为结构或枚举时,您将获得所有固有方法; impl Foo中定义的那些。您还可以访问该类型的任何公共字段。

  

如果我在 file2.rs 中获得了Foo的所有特征,并且我写了fn my_func(foo: Foo),我在这里有什么?这里是Foo结构或特征(impl Foo)吗?

impl Foo 不是特质trait Bar定义了一个特征。 impl Bar for Foo实现了Foo类型的特征。 impl Foo创建固有方法;这些与特质无关。

  

我阅读了Rust的书和手册,但是他们只解释了明确的用法,没有提到具有相同名称的特征(impl)会发生什么。 Rust书籍告诉您明确导入特征,如果是,Drop未导入use mod1::Foo,这真的非常糟糕。

对于语言设计师来说,这将是一个非常糟糕的主意。值得庆幸的是,他们没有这样做。导入某些内容只是允许导入它的代码使用它。如果代码没有导入,它就不会导致代码消失。

编译器本身是实现Drop的类型的用户,因此您可以将其视为编译器实现在其中的use Drop。这可能不是字面上 true,而是一个心智模型。仅仅因为您的代码无法导入Drop并不代表其他代码无法实现。

正如其他地方所述,您无需导入Drop,因为它included in the prelude