6 个版本

使用旧的 Rust 2015

0.2.4 2018年8月13日
0.2.3 2018年8月13日
0.1.1 2018年8月12日

2782Rust patterns

MIT 许可证

8KB
121 行 代码行

funfun

Build Status Coverage Status Codecov Coverage Status Crates.io Rust Documentation

spawn_fn!

spawn_fn! 接收一个闭包或函数及其参数,在一个新线程中运行闭包或函数,并返回线程的钩子。

let eg = box_fn!(|x: i32| -> i32 {x + 2});
let also = box_fn!(|x: i32, y: i32| -> i32 {x + y});

let mut v1 = Vec::new();
for i1 in 0..10000 {
    let i2 = i1 + 10;
    v1.push(spawn_fn!(eg, i1));
    v1.push(spawn_fn!(also, i1, i2)); // woohoo multi-arity!
}
v1.push(spawn_fn!(||{println!("accepts closures to run in their own thread!"); 1}));

for res in v1.into_iter() {
    res.join();
}

box_fn!

box_fn! 将闭包装箱并返回一个 Rc 指针。

type T = BoxFn<Fn(&str) -> String>;
struct F {
    c: T
}
let c: T = box_fn!(|s: &str| -> String {s.to_string()});
let mut f = F { c };
f.c = box_fn!(
    |d: &str| -> String {"reassign once".to_string()}
);
f.c = box_fn!(
    |_: &str| {"and again".to_string()}
);

arc_fn!

box_fn! 将闭包装箱并返回一个 Arc 指针。比 Rc 指针慢,但允许派生 Clone 等特质。

type T = ArcFn<Fn(&str) -> String>;
#[derive(Clone)]
struct F {
    c: T
}
let c: T = arc_fn!(|s: &str| -> String {s.to_string()});
let mut f = F { c };
f.c = arc_fn!(
    |d: &str| -> String {"reassign once".to_string()}
);
f.c = arc_fn!(
    |_: &str| {"and again".to_string()}
);

无运行时依赖