2 个不稳定版本
0.2.0 | 2021 年 6 月 25 日 |
---|---|
0.1.0 | 2021 年 6 月 18 日 |
#7 in #key-path
在 2 个 crate 中使用 (通过 keypath)
26KB
595 行
keypath
任意嵌套字段的强类型引用。
这是在 Rust 中实现 Swift 风格 keypaths 的早期实验。目前它被视为一个概念验证,缺少一些更高级的特性,如 '部分 keypaths' 和组合性,尽管实现这些特性不应特别具有挑战性。这个库 确实 包括我认为最困难的情况,即为编译时保证的类型生成类型化 keypaths。
这意味着您可以执行以下操作
#[derive(Keyable)]
struct Person {
name: String,
friends: Vec<String>,
size: Size,
}
#[derive(Keyable)]
struct Size {
big: bool,
heft: u8,
}
let mut person = Person {
name: "coco".into(),
friends: vec!["eli".into(), "nico".into(), "yaya".into()],
size: Size { big: false, heft: 45 }
};
let first_friend: KeyPath<Person, String> = keypath!(Person.friends[0]);
let heft = keypath!(Person.size.heft);
assert_eq!(person[&first_friend], "eli");
// mutation:
person[&heft] = 101;
assert_eq!(person.size.heft, 101);
这可能看起来不是特别有用,但它为 UI 绑定和可观察对象等事物提供了一个便利的构建块。
待办事项
这里有一些额外的功能和想法值得探索
- 允许集合访问返回可选项,支持链式调用:
People.friends[10]?.age
将允许索引操作失败。 - 为集合提供更简单的实现(目前是手动实现,没有 derive 可用)
- 支持在
keypath!
宏中添加泛型
依赖项
~1.5MB
~39K SLoC