2017-05-22 2 views
2

J'ai remarqué que, étant donné un P<SomeStruct>, l'accès aux champs de SomeStruct directement sur le pointeur semble fonctionner, et je ne sais pas pourquoi c'est le cas. Par exemple, le code compile et fonctionne comme prévu (gravures « 1234 »):Pourquoi l'accès à un champ sur un pointeur vers une structure fonctionne-t-il dans la rouille?

#![feature(rustc_private)] 

extern crate syntax; 
use syntax::ptr::P; 

struct Baz { 
    id: String, 
} 

fn foo() { 
    let mut struct_pointer: P<Baz> = P(Baz { 
     id: "1234".to_string(), 
    }); 
    println!("{}", struct_pointer.id); 
} 

Quelle est la caractéristique la langue qui me permet d'accéder à la zone id sur la struct_pointer de liaison? Déréférencement? Coercition? Et est-il possible de dire que ce genre de chose fonctionnera en regardant les docs pour P?

+3

Votre exemple est incomplet et non reproductible. Veuillez inclure vos définitions de 'P' et' Baz'. –

+1

Je suppose que 'P' est une syntaxe :: ptr :: P', et' Baz' une structure aléatoire? Étant donné l'implémentation de 'Deref' pour' P', il faut déréférencer la coercition. En fait, il en va de même pour "" 1234 ".to_string'. – Procrade

+0

@ E_net4, Procrade a raison, je pensais que ce serait assez clair, désolé pour la confusion. J'ai mis à jour l'exemple. –

Répondre

1

C'est implemented en utilisant the Deref trait. Il surcharge l'opérateur *. Dans Rust . déréférences automatiquement lorsque cela est nécessaire, de sorte que le compilateur peut interpréter foo.bar comme (*foo).bar.