#key-path #proc-macro #fields #keypaths #compile-time #person #following

keypath-proc-macros

为 keypath crate 提供的过程宏

2 个不稳定版本

0.2.0 2021 年 6 月 25 日
0.1.0 2021 年 6 月 18 日

#7 in #key-path


2 个 crate 中使用 (通过 keypath)

Apache-2.0

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