10个版本
0.1.43 | 2021年3月1日 |
---|---|
0.1.42 | 2020年12月22日 |
0.1.41 | 2020年1月12日 |
0.1.40 | 2019年12月13日 |
0.1.2 | 2019年5月6日 |
#889 在 数据结构 中
160KB
3.5K SLoC
此crate存在稳健性问题;请参阅文档和测试。
lib.rs
:
v9
是一个干净、易于使用且灵活的数据引擎。
它提供了一种使用 数据导向设计 实现应用程序的方法。
#[v9::table]
struct engines {
pub cylinder_count: u8,
pub lines_of_code: u64,
}
use v9::prelude::Universe;
let mut universe = Universe::new();
use v9::prelude::Register;
engines::Marker::register(&mut universe);
let (v9, v11) = universe.eval(|mut engines: engines::Write| {
(
engines.push(engines::Row {
cylinder_count: 9,
lines_of_code: 5000,
}),
engines.push(engines::Row {
cylinder_count: 11,
lines_of_code: std::u64::MAX,
}),
)
});
#[v9::table]
struct projects {
pub name: &'static str,
pub engine: crate::engines::Id,
}
projects::Marker::register(&mut universe);
universe.eval(|mut projects: projects::Write| {
projects.push(projects::Row {
name: "TOP SECRET!",
engine: v9,
});
projects.push(projects::Row {
name: "Stinky Cheese Inc!",
engine: v11,
});
});
universe.eval(|projects: projects::Read| {
assert_eq!(projects.iter().count(), 2);
});
universe.eval(|mut engines: engines::Write| {
engines.remove(v11);
});
universe.eval(|projects: projects::Read| {
// No dangling pointers!
assert_eq!(projects.iter().count(), 1);
});
(另一个示例。)
设计
一个 Universe
类似于一个 HashMap<TypeId, Any>
。任何类型的单个实例可以插入到宇宙中。然后可以通过运行一个 Kernel
来进行更改。一个 Kernel
是任何所有参数都实现了 Extract
的闭包,这是一个类似于 fn extract(&Universe) -> Self
的特质。
封装
此crate公开了很多不合理的东西。这是故意的!很难预见所有需求;希望你能从中得到一些有用的东西,这比满足我一时的想法而公开东西要诚实得多。
一个严肃的应用程序应该提供自己的接口来隐藏 v9
。
安全性
┐(ツ)┌
我的优先级是
- 一个漂亮的API。
- 必须快速运行
- 编译时间必须快。
- 批量操作(通过内核)必须非常快。
- 安全性。
防止猴子捣乱不是优先事项。话虽如此,你可能只有在寻找麻烦时才会遇到麻烦。
如果你发现了一些我们可能希望不编译的东西,并且在运行时没有以明显的方式崩溃,那么我会很关心。
依赖
~0.5–1MB
~25K SLoC