Non ho trovato Self
nella documentazione, solo nel codice sorgente. La documentazione utilizza solo self
.Qual è la differenza tra sé e sé?
risposta
self
se utilizzato come argomento del primo metodo, è una stenografia per self: Self
. Esistono anche &self
, che equivale a self: &Self
e &mut self
, che equivale a self: &mut Self
.
Self
in argomenti del metodo è zucchero sintattico per il tipo di ricezione del metodo (cioè il tipo avente impl
questo metodo è in). Ciò consente anche tipi generici senza troppe ripetizioni.
Self
è il tipo dell'oggetto corrente. Può apparire sia in un trait
o un impl
, ma appare più spesso in trait
dove è uno stand-in per qualsiasi tipo finirà per l'attuazione del trait
(che è sconosciuto al momento di definire la trait
):
trait Clone {
fn clone(&self) -> Self;
}
Se io quindi implementare 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;
}
potrei anche usarlo in un normale impl
se io sono pigro (è più corta!):
impl MySuperLongType {
fn new(a: u32) -> Self { ... }
}
self
è il nome utilizzato in un trait
o un impl
per il primo argomento di un metodo. Utilizzando un altro nome è possibile, tuttavia v'è una differenza notevole:
- se si utilizza
self
, la funzione introdotta è un metodo - se utilizzando qualsiasi altro nome, la funzione introdotta è una funzione associata
In Rust, non esiste un argomento implicito this
passato ai metodi di un tipo: è necessario passare esplicitamente "l'oggetto corrente" come parametro del metodo. Questo si tradurrebbe in:
impl MyType {
fn doit(this: &MyType, a: u32) { ... }
}
Come abbiamo visto, come una forma più breve questo potrebbe anche essere (ancora verbose):
impl MyType {
fn doit(this: &Self, a: u32) { ... }
}
che è in realtà ciò che &self
si riduce a sotto le coperte.
impl MyType {
fn doit(&self, a: u32) { ... }
}
Quindi, la tabella di corrispondenza:
self => self: Self
&self => self: &Self
&mut self => self: &mut Self
Il modo per richiamare le funzioni cambiano, tuttavia:
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`
}
** Può apparire in un tratto o in un impl ** - non può apparire in "struct"? –
@jawanam: Personalmente ottengo * errore: uso di 'Self' al di fuori di impl o trait * se lo provo. Forse la restrizione è stata revocata in una versione più recente? –
No, al momento non è possibile (a partire dalla notte 2015-09-01). Le strutture autoreferenziali sono piuttosto rare, quindi aggiungere l'autoassistenza in questo caso è stato considerato a bassa priorità. – llogiq
- 1. Differenza tra sé debole vs sé debole()
- 2. Qual è la differenza tra sé e la finestra?
- 3. Distinzione in Swift tra "Sé" maiuscolo e "Sé" minuscolo
- 4. JSONAPI - Differenza tra sé e correlati in una risorsa collegamenti
- 5. Il "sé" è necessario?
- 6. In Swift, qual è la differenza tra i due diversi usi di sé?
- 7. Rubino Definizione del Sé
- 8. laravel Menu sé ricorsione
- 9. R riferimento sé
- 10. sé postgresql join
- 11. Qual è la differenza tra un riferimento __weak e __block?
- 12. Qual è la differenza tra glTexParameter e glSamplerParameter
- 13. Comprendere il "sé" e impostarlo su super
- 14. Differenza b/n Obiettivo Il sé di C e C++ è questo?
- 15. Classe C++ non è di per sé
- 16. NameError: nome di 'sé' non è definito
- 17. blocchi nidificati e riferimenti a sé
- 18. Qual è la differenza tra = e: =
- 19. Qual è la differenza tra Verilog! e ~?
- 20. Qual è la differenza tra? : e ||
- 21. qual è la differenza tra [[], []] e [[]] * 2
- 22. Qual è la differenza tra $ e $$?
- 23. Qual è la differenza tra ("") e (null)
- 24. Qual è la differenza tra dict() e {}?
- 25. Qual è la differenza tra " " e ""?
- 26. Qual è la differenza tra {0} e ""?
- 27. Qual è la differenza tra `##` e `hashCode`?
- 28. Qual è la differenza tra {0} e +?
- 29. Qual è la differenza tra .ToString() e + ""
- 30. qual è la differenza tra:.! e: r !?
Vedere la documentazione qui: https: //doc.rust-lang. org/reference.html # self-types – phoenix