Recherche…


Remarques

  • AsRef et Borrow sont similaires mais servent des objectifs distincts. Borrow est utilisé pour traiter plusieurs méthodes d'emprunt de la même manière, ou pour traiter les valeurs empruntées comme leurs homologues possédés, alors que AsRef est utilisé pour la généralisation de références.
  • From<A> for B implique Into<B> for A , mais pas l'inverse.
  • From<A> for A est implicitement implémenté.

De

Le trait Rust's From est un trait général pour la conversion entre les types. Pour deux types TypeA et TypeB ,

impl From<TypeA> for TypeB

indique qu'une instance de TypeB est garantie d'être constructible à partir d'une instance de TypeA . Une implémentation de From ressemble à ceci:

struct TypeA {
    a: u32,
}

struct TypeB {
    b: u32,
}

impl From<TypeA> for TypeB {
    fn from(src: TypeA) -> Self {
        TypeB {
            b: src.a,
        }
    }
}

AsRef & AsMut

std::convert::AsRef et std::convert::AsMut sont utilisés pour convertir les types en références à moindre coût. Pour les types A et B ,

impl AsRef<B> for A

indique que a &A peut être converti en a &B et,

impl AsMut<B> for A

indique que a &mut A peut être converti en &mut B

Ceci est utile pour effectuer des conversions de type sans copier ou déplacer des valeurs. Un exemple dans la bibliothèque standard est std::fs::File.open() :

fn open<P: AsRef<Path>>(path: P) -> Result<File>

Cela permet à File.open() d’accepter non seulement le Path , mais aussi OsStr , OsString , str , String et PathBuf avec une conversion implicite car ces types implémentent tous AsRef<Path> .

Emprunter, emprunterMut et ToOweded

Les traits std::borrow::BorrowMut std::borrow::Borrow et std::borrow::BorrowMut sont utilisés pour traiter les types empruntés comme les types possédés. Pour les types A et B ,

impl Borrow<B> for A

indique qu'un A emprunté peut être utilisé lorsqu'un B est souhaité. Par exemple, std::collections::HashMap.get() utilise Borrow pour sa méthode get() , permettant à HashMap avec les clés de A d'être indexées avec a &B


En revanche, std::borrow::ToOwned implémente la relation inverse.

Ainsi, avec les types susmentionnés A et B on peut implémenter:

impl ToOwned for B

Remarque: alors que A peut implémenter Borrow<T> pour plusieurs types distincts T , B ne peut implémenter que ToOwned une fois.

Deref & DerefMut

Les traits std::ops::Deref et std::ops::DerefMut sont utilisés pour surcharger l'opérateur de déréférencement, *x . Pour les types A et B ,

impl Deref<Target=B> for A

indique que le déréférencement d'une liaison de &A donnera un &B et,

impl DerefMut for A

indique que le déréférencement d'une liaison de &mut A donnera un &mut B

Deref (resp. DerefMut ) fournit également une fonction de langage utile appelée deref coercion , qui permet à a &A (resp. &mut A ) de forcer automatiquement a &B (resp. &mut B ). Ceci est couramment utilisé lors de la conversion de String en &str , as &String étant implicitement contraint à &str si nécessaire.


Remarque: DerefMut ne prend pas en charge la spécification du type résultant, il utilise le même type que Deref .

Remarque: En raison de l'utilisation d'un type associé (contrairement à AsRef ), un type donné ne peut implémenter que Deref et DerefMut au plus une fois.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow