Poniższy kod Rust nie kompilacji:Dlaczego `Self` nie może być użyty w odniesieniu do wariantu wyliczeniowego w treści metody?
enum Foo {
Bar,
}
impl Foo {
fn f() -> Self {
Self::Bar
}
}
Komunikat o błędzie mnie dezorientuje:
error[E0599]: no associated item named `Bar` found for type `Foo` in the current scope
--> src/main.rs:7:9
|
7 | Self::Bar
| ^^^^^^^^^
Problemem mogą być mocowane za pomocą Foo
zamiast Self
, ale wydaje mi się dziwne, ponieważ Self
ma odnosić się do wprowadzanego typu (ignorowanie cech), który w tym przypadku jest Foo
.
enum Foo {
Bar,
}
impl Foo {
fn f() -> Self {
Foo::Bar
}
}
Dlaczego w tej sytuacji nie można zastosować Self
? Gdzie dokładnie można użyć Self
*? Czy jest coś jeszcze, czego mogę użyć, aby uniknąć powtarzania nazwy typu w treści metody?
* Ignoruję użycie w cechach, gdzie Self
odnosi się do dowolnego typu implementuje tę cechę.
Wyliczenia są nieco dziwne, ponieważ działają między typami i przestrzeniami nazw. W tym przypadku Foo działa bardziej jako przestrzeń nazw. To powiedziawszy, czy to tylko ciekawość, czy to uniemożliwia ci zrobienie czegoś, co chciałbyś robić? –
@PaoloFalabella Powszechnym użyciem 'Self' jest tutaj zmniejszenie liczby powtórzeń nazwy typu. Miałem tylko nadzieję, że mogłem zrobić to samo w ciałach metod. – Challenger5
Natknąłem się na jakiś dobry artykuł, https://users.rust-lang.org/t/confused-by-use-of-self-in-example-in-chapter17-of-rust-book-2nd- edycja/11394. Mam nadzieję, że może ci pomóc. – shri