2017-07-30 1 views
0

J'utilise le motif décorateur et je trouve que même s'il fonctionne sur une référence mutable, il ne fonctionne pas sur un modèle immuable. Quelqu'un a-t-il une meilleure idée?Motif décorateur et référence immuable

pub struct Slave { 
    pub is_drive: bool 
} 

impl Slave { 
    fn is_drive(&self) -> bool { 
     self.is_drive 
    } 
} 

Drive est un type de Slave décorateur.

pub struct Drive<'a> { 
    pub slave: &'a mut Slave, 
} 

impl<'a> Drive<'a> { 
    // Create drive. 
    pub fn new(slave: &mut Slave) -> Drive { 
     Drive { 
      slave: slave, 
     } 
    } 
} 

Drive ne peut être utilisé avec un &mut Slave, mais j'aimerais obtenir un &Drive d'un &Slave:

fn main() { 
    let s1 = &mut Slave { is_drive: true }; 
    let d1 = Drive::new(s1); 

    // Doesn't work 
    // let s2 = & Slave { is_drive: true }; 
    // let d2 = Drive::new(s2); 
} 

Edit:

Drive ne peut être utilisé avec un &mut Slave , mais parfois j'en ai besoin pour un &Slave. Je ne fonctionne pas utiliser accesseur car l'esclave ne doit pas dépendre d'entraînement:

fn config_slave(slave: &mut Slave) { 
    ... 
    if slave.is_drive() { 
     let drive = Drive::new(slave) { 
      // call functions provided by Drive 
     } 
    } 
    ... 
} 

fn print_slave(slave: &Slave) { 
    ... 
    if slave.is_drive() { 
     let drive = Drive::new(slave) { 
      // Call functions provided by Drive 
     } 
    } 
    ... 
} 
+0

Pourquoi avez-vous défini 'pub slave: & 'un mut Slave,' comme mutable? Il suffit de le changer en 'pub slave: & 'un esclave,'. Sinon, oui, il est probable qu'il s'agisse d'un doublon. – Shepmaster

+3

bibliothèque standard Exemple: 'std :: :: cellule Ref' et' std :: :: cellule RefMut'. Si les auteurs de la bibliothèque standard ne parviennent pas à un seul type à gérer à la fois l'accès muable et immuable (à la compilation), les chances sont bonnes que vous ne serez pas ... et si vous parvenez, alors s'il vous plaît expliquer comment vous a fait et aider à améliorer la bibliothèque standard! –

Répondre

0

Prendre std::cell::Ref et std::cell::RefMut comme exemple, je fournirai un Drive pour &Slave et un DriveMut pour &mut Slave.