2 个不稳定版本
使用旧 Rust 2015
0.2.0 | 2017年10月26日 |
---|---|
0.1.0 | 2017年10月14日 |
#18 in #dynamically-sized
12KB
302 行
为实现了 DynSized
特性的动态大小类型提供薄指针类型。所谓“薄”,意味着它们将元数据(即切片长度或虚函数表指针)与数据一起存储,而不是存储在指针本身中。目前提供了 ThinBox
,这是 Box
的薄版本。
示例:在 ThinBox
中存储闭包;
extern crate thin;
#[macro_use] extern crate dyn_sized;
use thin::{ThinBox, FnMove};
// Define our own subtrait to get around the orphan rule for trait impls
// Have to use `FnMove` instead of `FnOnce` or `FnBox`
trait Closure: FnMove(&str) -> String {}
derive_DynSized!(Closure<Output=String>);
fn main() {
let s1 = String::from("Hello");
let closure: ThinBox<FnMove(&'static str) -> String> = ThinBox::new(move |s2|{
s1 + " " + s2 + "!"
});
assert_eq!("Hello World!", closure("World"));
}
这里有几个需要注意的地方:一个是我们需要为我们的闭包特质对象类型派生 DynSized
,以便将其存储在 ThinBox
中。由于特质实现的孤儿规则,我们需要定义自己的特质 Closure
来实现这一点。另一个需要注意的事情是我们的 Closure
特质将 FnMove
作为超特质,而不是 FnBox
或 FnOnce
,以便可以从 ThinBox
内部调用它。不过这没关系,因为 ThinBox<F: FnMove>
实现 FnOnce
,我们可以直接调用 ThinBox<Closure>
。
依赖
~14KB