#type-erasure #table #require #virtual #wrapper #fn-mut #virtual-table

simple-ref-fn

无需虚拟表要求的简单函数包装器

3 个版本

0.1.2 2022年12月12日
0.1.1 2022年12月12日
0.1.0 2022年12月11日

#3#fn-mut

MIT 许可证

20KB
430

simple-ref-fn

crates.io docs CI codecov Coverage Status

无需虚拟表的类型擦除函数包装器。


lib.rs:

此包提供类型擦除的函数包装器,其行为类似于 &dyn Fn(T) -> R&mut dyn FnMut(T) -> R,但无需编译器生成虚拟表。

以下提供包装器类型:

类型 行为类似于 Send Sync
RefFn<'a, T, R> &'adynFn(T) ->R
RefSyncFn<'a, T, R> &'a (dynFn(T) ->R+ Sync)
RefFnMut<'a, T, R> &'a mutdynFnMut(T) ->R
RefSendFnMut<'a, T, R> &'a mut (dynFnMut(T) ->R+ Send)

示例

将函数与引用绑定

use simple_ref_fn::{RefFn, StaticRefFunction};

// Define a static function.

struct F;

impl StaticRefFunction<'_, u32, u32> for F {
    type Output = u32;

    fn call(data: &u32, arg: u32) -> Self::Output {
        data + arg
    }
}

// Bind the function with a reference.

let data = 2;
let f: RefFn<u32, u32> = F::bind(&data); // Type-erasure.

assert_eq!(f.call(3), 5);
assert_eq!(f.call(5), 7);
assert_eq!(f.call(7), 9);

擦除闭包的类型

use simple_ref_fn::RefFn;

let data = 2_u32;
let closure = |arg: u32| data + arg;
let f: RefFn<u32, u32> = RefFn::from(&closure);  // Type-erasure.

assert_eq!(f.call(3), 5);
assert_eq!(f.call(5), 7);
assert_eq!(f.call(7), 9);

无运行时依赖