#pointers #dynamically-sized #type

nightly thin

对动态大小类型的薄指针

2 个不稳定版本

使用旧 Rust 2015

0.2.0 2017年10月26日
0.1.0 2017年10月14日

#18 in #dynamically-sized

MIT/Apache

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 作为超特质,而不是 FnBoxFnOnce,以便可以从 ThinBox 内部调用它。不过这没关系,因为 ThinBox<F: FnMove> 实现 FnOnce,我们可以直接调用 ThinBox<Closure>

依赖

~14KB