Self |
Soi |
|---|---|
| Rust | |
Syntaxe
| fn nom_de_la_methode(&self) |
| fn nom_de_la_methode(&mut self) |
| fn nom_de_la_methode(self) |
|
impl MaStruct { fn nouvelle() -> Self { Self { champ: 0 } } } |
Paramètres
| Nom | Description |
|---|---|
| &self | Ce paramètre permet de passer une référence immuable à l'instance actuelle dans une méthode. |
| &mut self | Ce paramètre permet de passer une référence mutable à l'instance actuelle dans une méthode. |
| self | Ce paramètre permet de transférer la possession de l'instance à la méthode. |
| Self | Ce paramètre permet de faire référence au type dans lequel l'implémentation est en cours, notamment pour les constructeurs ou types associés. |
Description
Ce mot réservé permet d'indiquer un alias de type pour le type que vous définissez ou mettez en oeuvre.
Remarques
Permet d'indiquer le récepteur d'une méthode, ou le module courant.
self est utilisé dans deux situations : pour référencer le module courant et pour marquer le récepteur d'une méthode.
Dans les chemins, self peut être utilisé pour faire référence au module courant, soit dans une instruction use, soit dans un chemin d'accès à un élément :
- use std::io::{self, Read};
Est fonctionnellement le même que :
- use std::io;
- use std::io::Read;
Utilisation de self pour accéder à un élément du module actuel :
Utiliser self comme récepteur courant d'une méthode permet généralement d'omettre le type du paramètre. À cette exception près, self s'utilise comme tout autre paramètre :
- struct Foo(i32);
-
- impl Foo {
- // No `self`.
- fn new() -> Self {
- Self(0)
- }
-
- // Consuming `self`.
- fn consume(self) -> Self {
- Self(self.0 + 1)
- }
-
- // Borrowing `self`.
- fn borrow(&self) -> &i32 {
- &self.0
- }
-
- // Borrowing `self` mutably.
- fn borrow_mut(&mut self) -> &mut i32 {
- &mut self.0
- }
- }
-
- // Cette méthode doit être appelée avec un préfixe `Type::`.
- let foo = Foo::new();
- assert_eq!(foo.0, 0);
-
- // Ces deux appels produisent le même résultat.
- let foo = Foo::consume(foo);
- assert_eq!(foo.0, 1);
- let foo = foo.consume();
- assert_eq!(foo.0, 2);
-
- // L'emprunt est géré automatiquement avec la deuxième syntaxe.
- let borrow_1 = Foo::borrow(&foo);
- let borrow_2 = foo.borrow();
- assert_eq!(borrow_1, borrow_2);
-
- // L'emprunt mutable est également géré automatiquement avec la deuxième syntaxe.
- let mut foo = Foo::new();
- *Foo::borrow_mut(&mut foo) += 1;
- assert_eq!(foo.0, 1);
- *foo.borrow_mut() += 1;
- assert_eq!(foo.0, 2);
Notez que cette conversion automatique lors de l'appel de foo.method() ne se limite pas aux exemples ci-dessus.