Serializable closures.
This library provides macros to wrap closures such that they can serialized and sent between other processes running the same binary.
rust
fn sum_of_squares(input: &[i32]) -> i32 {
input.dist_iter()
.map(Fn!(|&i| i * i))
.sum()
}
For example, if you have multiple forks of a process, or the same binary running on each of a cluster of machines, this library would help you to send closures between them.
This library aims to work in as simple and un-magical a way as possible. It
currently requires nightly Rust for the unboxed_closures
and fn_traits
features (rust issue #29625).
Inferred, non-capturing closure:
rust
|a| a+1
rust
FnMut!(|a| a+1)
Annotated, non-capturing closure:
rust
|a: String| -> String { a.to_uppercase() }
rust
FnMut!(|a: String| -> String { a.to_uppercase() })
Inferred closure, capturing num
:
rust
let mut num = 0;
|a| num += a
rust
let mut num = 0;
FnMut!([num] |a| *num += a)
Note: As this is a FnMut closure, num
is a mutable reference, and must be
dereferenced to use.
move
closure, capturing hello
and world
:
rust
let hello = String::from("hello");
let mut world = String::new();
move |name| {
world += (hello.to_uppercase() + name).as_str();
}
rust
let hello = String::from("hello");
let mut world = String::new();
FnMut!([hello, world] move |name| {
*world += (hello.to_uppercase() + name).as_str();
})
Note: world
must be dereferenced to use.
As visible above, there are currently some minor limitations:
* The captured variables in FnMut and Fn closures are references, so need
to be dereferenced;
* Compiler errors are not as helpful as normal:
text
error[E0308]: mismatched types
...
= note: expected type `for<..> fn(&'r mut (..), (..))`
found type `[closure@<FnMut macros>:9:9: 10:44 my_var:_]`
means that my_var
is a captured variable, but was not explicitly listed.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.