closure_attr
This crate provides an attribute to simplify closure captures.
Example
use ;
// Expects a 'static callback
// Enable use of #[closure(...)]
example;
It expands to:
use_callback({
let s = s.clone();
let i = i.clone();
move || {
s.replace(format!("Hello, world! {}", i.get()));
i.set(i.get() + 1);
}
});
Capture types
| Syntax | Description |
|---|---|
clone <ident> |
Clone the variable |
clone mut <ident> |
Clone the variable and make it mutable |
ref <ident> |
Take a reference to the variable |
ref mut <ident> |
Take a mutable reference to the variable |
rcweak <ident> |
See below |
arcweak <ident> |
See below |
rcweak and arcweak
rcweak and arcweak use weak pointers to help break up reference cycles.
They downgrade an Rc or Arc pointer and capture it. The transformed
closure upgrades the reference when it is called. If any upgrade fails, it skips
executing the body and returns Default::default().
use ;
example;
This Expands to:
let closure = {
let r = ::std::rc::Rc::downgrade(&r);
let a = ::std::sync::Arc::downgrade(&a);
move || {
(|| {
let r = r.upgrade()?;
let a = a.upgrade()?;
Some((|| *r * *a)())
})()
.unwrap_or_default()
}
};
License
This work is dual-licensed under MIT and Apache 2.0. You can choose between one of them if you use this work.
SPDX-License-Identifier: MIT OR Apache-2.0