我有模块 mod1.rs :
pub struct Foo;
impl Foo {}
impl Drop for Foo {
fn drop(&mut self) {}
}
在 file2.rs 中,我写了use mod1::Foo;
。
我在 file2.rs 中实际拥有什么?只有struct Foo
,impl Foo
?那么impl Drop for Foo
呢?
如果我在 file2.rs 中获得Foo
的所有特征,我会写
fn my_func(foo: Foo)...
,我在这里有什么? Foo
是struct
还是特质(impl Foo
)?
我阅读了Rust的书和手册,但他们只是解释
显式用法,不提及trait
具有相同名称(impl
)的情况。 Rust书籍告诉您明确导入特征,如果是,Drop
未导入use mod1::Foo
,这真的非常糟糕。
答案 0 :(得分:4)
在 file2.rs 中,我写了
use mod1::Foo;
。我在 file2.rs 中实际拥有什么?只有
struct Foo
,impl 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。