#lens #traversing #pattern #macro-derive

lens-rs_derive

用于派生数据类型lens的宏

13个不稳定版本 (3个破坏性版本)

0.3.2 2021年5月7日
0.3.1 2021年4月8日
0.2.2 2021年4月3日
0.2.1 2021年3月29日
0.0.88 2021年3月21日

#4 in #traversing


3个crate中使用了(通过lens-rs

MIT/Apache

105KB
2.5K SLoC

概述

为自定义数据类型派生lens。

查看指南

示例

#[derive(Debug, Lens)]
struct Baz<'a, A, B, C>{
    #[optic(ref)] 
    a: &'a A,     // can only take the immutable ref by optics::a
    #[optic(mut)] 
    b: &'a mut B, // can take the mutable ref by optics::b
    #[optic]
    c: C          // can mv it out by by optics::c
}

#[derive(Review, Prism, Debug)]
enum AnEnum<T> {
    A(T, i32), // couldn't derive Prism or Review
    #[optic] 
    B(T),
    #[optic]
    C,
    #[optic]
    D(),
    #[optic]
    E {},
}

#[derive(Lens, Debug)]
struct Foo {
    #[optic] a: i32,
    #[optic] b: i32,
}

fn test() -> Option<()> {
    let x = Review::review(optics!(Some.B), Foo {
        a: 3,
        b: 2,
    });
    assert_eq!(x.preview(optics!(Some.B.b))?, 2);
    
    Some(())
}

限制

  • 不能为枚举派生Lens
  • 不能为具有多个参数或具有命名字段的变体派生PrismReview

依赖项

~1.2–1.8MB
~42K SLoC