Expand description
Have you ever needed to pass a mutable reference to yourself to a struct member? Now you can! 100% safe rust code.
§Examples
§You can pass mutable references to self into member structs:
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn main() {
struct Sub;
impl Sub {
pub fn write(&mut self, t: &mut Top) {
t.0.push_str("test");
}
}
struct Top(pub String, pub Detach<Sub>);
impl Top {
pub fn run(&mut self) {
detach_run!(self.1, |s| s.write(self));
}
}
let mut t = Top("".to_string(), Detach::new(Sub));
t.run();
assert_eq!("test", &t.0);
}§You can invoke detach_run! with an exper:
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn main() {
let mut i = Detach::new(42_i8);
detach_run!(i, |z| z = 3);
assert_eq!(3, *i);
}§You can invoke detach_run! with a block:
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn main() {
let mut i = Detach::new(42_i8);
detach_run!(i, |z| {
z = 3;
});
assert_eq!(3, *i);
}§You can return info from the macro:
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn main() {
let mut i = Detach::new(42_i8);
let z = detach_run!(i, |z| {
z = 3;
return z;
});
assert_eq!(3, *i);
assert_eq!(3, z);
}§You cannot use ? directly (we wouldn’t re-attach the member):
ⓘ
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn main() {
let mut i = Detach::new(42_i8);
detach_run!(i, |z| {
z = 3;
let r: Result<(), ()> = Ok(());
// THIS WON'T COMPILE:
r?;
});
assert_eq!(3, *i);
}§But you can return results, and ? after the macro:
#[macro_use]
extern crate detach;
use detach::prelude::*;
fn test() -> Result<(), ()> {
let mut i = Detach::new(42_i8);
detach_run!(i, |z| {
z = 3;
let r: Result<(), ()> = Ok(());
return r;
})?;
assert_eq!(3, *i);
Ok(())
}
fn main() {
test().unwrap();
}Modules§
Macros§
Structs§
- Detach
- Allows sub-struct to be easily detached and re-attached