Trait core_extensions::callable::CallRef
source · [−]pub trait CallRef<Params>: CallMut<Params> {
fn ref_call_(&self, params: Params) -> Self::Returns;
}
Available on crate feature
callable
only.Expand description
Implementable alternative to std::ops::Fn
.
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 MulBy<T>(T);
impl_call! {
fn ref_call[T](self: MulBy<T>, lhs: T ) -> T
where[ T: Clone + std::ops::Mul<Output = T> ]
{
lhs * self.0.clone()
}
}
let two = MulBy(2);
let seven = MulBy(7);
assert_eq!(two.ref_call(3), 6);
assert_eq!(two.ref_call(5), 10);
assert_eq!(seven.ref_call(3), 21);
assert_eq!(seven.ref_call(5), 35);
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 fn_0 = || 10;
assert_eq!(fn_0.ref_call(()), 10);
let fn_1 = |a: i32| a + 10;
assert_eq!(fn_1.ref_call((5,)), 15);
let fn_2 = |a: i32, b: i32| a + b;
assert_eq!(fn_2.ref_call((8, 13)), 21);