Nie natknąłem się na Self
w dokumentacji, tylko w kodzie źródłowym. Dokumentacja używa tylko self
.Jaka jest różnica między Ja i Ja?
Odpowiedz
self
używany jako pierwszy argument metody, jest skrótem dla self: Self
. Istnieje również &self
, który jest równoważny self: &Self
i &mut self
, co jest równoważne z self: &mut Self
.
Self
w argumenty metoda jest cukier składniowym dla typu odbiorczego metod (tj rodzaju, który to sposób impl
w). Pozwala to również na typy ogólne bez zbytniego powtarzania.
Self
to typ bieżącego obiektu. Może się wydawać, albo w trait
lub impl
, ale pojawia się najczęściej w trait
gdzie jest to stand-in dla dowolnego typu zakończy się wdrażającego trait
(który jest nieznany podczas definiowania trait
):
trait Clone {
fn clone(&self) -> Self;
}
gdybym wtedy wdrożyć Clone
:
impl Clone for MyType {
// I can use either the concrete type (known here)
fn clone(&self) -> MyType;
// Or I can use Self again, it's shorter after all!
fn clone(&self) -> Self;
}
mogę również używać go w sposób regularny impl
jeśli jestem leniwy (to krócej!):
impl MySuperLongType {
fn new(a: u32) -> Self { ... }
}
self
to nazwa w trait
lub impl
do pierwszego argumentu metody. Korzystanie inna nazwa to możliwe, jednak nie jest zauważalna różnica:
- przypadku korzystania
self
funkcja wprowadzona jest metoda - w przypadku korzystania z żadnego innego imienia, funkcja wprowadzona jest związana funkcja
W Rust nie ma żadnego niejawnego argumentu przekazanego do metod typu: musisz jawnie przekazać "bieżący obiekt" jako parametr metody. Spowodowałoby:
impl MyType {
fn doit(this: &MyType, a: u32) { ... }
}
Jak widzieliśmy, jak krótszej formie to może być również (wciąż gadatliwy):
impl MyType {
fn doit(this: &Self, a: u32) { ... }
}
która jest faktycznie co &self
sprowadza się pod kołdrą.
impl MyType {
fn doit(&self, a: u32) { ... }
}
Zatem tabela korespondencji:
self => self: Self
&self => self: &Self
&mut self => self: &mut Self
Sposób powoływania zmienić te funkcje, jednakże:
impl MyType {
fn doit(&self, a: u32) {
// ...
}
fn another(this: &Self, a: u32) {
// ...
}
}
fn main() {
let m = MyType;
// Both can be used as an associated function
MyType::doit(&m, 1);
MyType::another(&m, 2);
// But only `doit` can be used in method position
m.doit(3); // OK: `m` is automatically borrowed
m.another(4); // ERROR: no method named `another`
}
** Może pojawić się w jednej rzeczy lub w impl ** - nie może pojawić się w "struct"? –
@jawanam: Osobiście dostaję * błąd: użycie 'Self' poza impaktem lub cechą *, jeśli spróbuję. Może ograniczenie zostanie zniesione w nowszej wersji? –
Nie, obecnie nie jest możliwe (od rana 2015-09-01). Struktury samo-referencyjne są dość rzadkie, więc dodanie w tym przypadku samoobsługi zostało uznane za niski priorytet. – llogiq
- 1. Różnica między tym i ja w JavaScript
- 2. Zła praktyka zachowania "ja"?
- 3. "Ja" wewnątrz funkcji zwykłej?
- 4. Jaka jest różnica między? : i ||
- 5. Jaka jest różnica między $ i $$?
- 6. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 7. Jaka jest różnica między HttpResponseMessage i HttpResponseException
- 8. Jaka jest różnica między NSPhotoLibraryAddUsageDescription i NSPhotoLibraryUsageDescription?
- 9. Jaka jest różnica między LDADD i LIBADD?
- 10. Jaka jest różnica między System.Linq.Enumerable.WhereListIterator i System.Linq.Enumerable.WhereSelectListIterator?
- 11. Zrozumienie "ja" i ustawienie siebie jako super
- 12. MVC 4, lista Checkbox i ja
- 13. Kiedy używać „ja” w Ruby
- 14. Używanie "ja" w anonimowym oddzwonieniu?
- 15. Co oznacza "ja" w javascript?
- 16. Jaka jest różnica między Subtotal i BaseSubtotal?
- 17. Jaka jest różnica między DetachedCriteria i ICriteria
- 18. Jaka jest różnica między & # x00A0; i ?
- 19. Jaka jest różnica między lex i yacc
- 20. jaka jest różnica między dijit i dojo
- 21. Jaka jest różnica między Control.Select() i Control.Focus()?
- 22. Jaka jest różnica między apletami i SWING?
- 23. Jaka jest różnica między session.commit() i session.flush()?
- 24. Jaka jest różnica między ImageView.setBackgroundResource i ImageView.setImageResource?
- 25. Jaka jest różnica między Konwertuj i parsuj?
- 26. Jaka jest różnica między JSP i JSTL?
- 27. Jaka jest różnica między Lazarus i CodeTyphon
- 28. Jaka jest różnica między crc32 i crc32b?
- 29. Jaka jest różnica między TypedArray.getInteger() i TypedArray.getInt()?
- 30. jaka jest różnica między ARM7 i ARM7s
Zobacz docs tutaj: https: //doc.rust-lang. org/reference.html # self-types – phoenix