【发布时间】:2018-03-05 22:14:27
【问题描述】:
这个问题现在已经过时了,因为这个功能已经实现了。 Related answer.
以下 Rust 代码编译失败:
enum Foo {
Bar,
}
impl Foo {
fn f() -> Self {
Self::Bar
}
}
错误信息让我很困惑:
error[E0599]: no associated item named `Bar` found for type `Foo` in the current scope
--> src/main.rs:7:9
|
7 | Self::Bar
| ^^^^^^^^^
问题可以通过使用Foo 而不是Self 来解决,但这让我觉得很奇怪,因为Self 应该是指正在实现的类型(忽略特征),在这种情况下是Foo.
enum Foo {
Bar,
}
impl Foo {
fn f() -> Self {
Foo::Bar
}
}
为什么不能在这种情况下使用Self? Self具体可以用在哪里*?还有什么我可以用来避免在方法体中重复类型名称的吗?
* 我忽略了特征中的用法,其中Self 指的是实现特征的任何类型。
【问题讨论】:
-
枚举有点奇怪,因为它们介于类型和命名空间之间。在这种情况下,Foo 更像是一个命名空间。也就是说,这只是出于好奇,还是阻止了你做你想做的事情?
-
@PaoloFalabella 这里
Self的常用用法是减少类型名称的重复。我只是希望我可以在方法体中做同样的事情。 -
我遇到了一些好文章,users.rust-lang.org/t/…。希望对你有所帮助。
-
这个问题是关于以前缺少的功能现在存在的,所以它不再相关。