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
}
}
...
}
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
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! –