Trait core_extensions::callable::CallMut
source · [−]pub trait CallMut<Params>: CallInto<Params> {
fn mut_call_(&mut self, params: Params) -> Self::Returns;
}
Available on crate feature
callable
only.Expand description
Implementable alternative to std::ops::FnMut
.
Parameters
The Call*
traits encode multiple parameters like this:
-
0 parameters: by taking a
()
parameter, eg:foo.ref_call(())
. -
1 parameters: by taking the single parameter, eg:
foo.ref_call(10)
. -
2 or more parameters: by taking a tuple of the parameters, eg:
foo.ref_call((10, 20))
.
Example
use core_extensions::{impl_call, CallExt};
struct Reporter{
line: u32,
}
impl_call! {
fn mut_call(self: Reporter, buffer: &mut String, person: &str, score: u32) {
use std::fmt::Write;
writeln!(buffer, "{}- {}: {}", self.line, person, score).unwrap();
self.line += 1;
}
}
let mut reporter = Reporter{line: 0};
let mut buffer = String::new();
reporter.mut_call((&mut buffer, "foo", 10));
reporter.mut_call((&mut buffer, "bar", 7));
reporter.mut_call((&mut buffer, "baz", 1000));
assert_eq!(
buffer,
"\
0- foo: 10\n\
1- bar: 7\n\
2- baz: 1000\n\
"
);
Closure impls
Closures implement the Call*
traits,
and they always require a tuple of the parameters to be passed in.
use core_extensions::CallExt;
let mut i = 0;
let mut fn_0 = ||{i += 1; i};
assert_eq!(fn_0.mut_call(()), 1);
let mut fn_1 = |a: i32|{i += 1; a + i};
assert_eq!(fn_1.mut_call((5,)), 7);
let mut fn_2 = |a: i32, b: i32|{i += 1; a + b + i};
assert_eq!(fn_2.mut_call((8, 13)), 24);