#data #lens #pub #traits #structures #higher-order #type

镜头

一个受 Julien Truffaut 的 Monocle 启发的光学库

1 个不稳定版本

0.1.0 2018 年 10 月 24 日

#2045数据结构

Apache-2.0

15KB
286

Rust 镜头

该项目受 Lens 功能设计模式启发,用于更改代数数据类型中的不可变字段。该项目受 Julien Truffaut 的 Monocle 库(反过来又受 Haskell 的 Lens 启发)启发。

请注意,目前 Rust 不支持高阶类型,因此并非所有功能都可用。

将以下内容包含到您的项目中

[dependencies]
lenses = "0.1"
#[macro_use]
extern crate lenses;

描述

镜头是可组合的高阶结构,用于操作数据类型。镜头有一个 view 和一个 set 函数。镜头定义为 pub trait Lens<S, A>,这意味着镜头可以从任何 S 类型的值中读取和写入 A 类型的值。

pub fn lens<'a, S, A>(getter: &'a Fn(&S) -> A, setter: &'a Fn(&S, &A) -> S) -> Lens<S, A> 将根据一个获取器和设置器函数生成一个镜头。

镜头也可以通过以下方式组合:pub fn compose<'a, S, A, B>(lhs: &'a Lens<S, A>, rhs: &'a Lens<A, B>) -> Lens<S, B>

所有镜头也都是 Getter<S, A>,这是一种较弱的变体,只包含获取部分。

有宏可以生成用于结构体字段和嵌套结构体字段的镜头,分别是 struct_lens!gen_lens!

这些宏期望你的镜头是 CloneCopy。由于这种模式对不可变数据结构最有意义,因此期望这样的数据结构至少是 Clone

gen_lens 宏的语法如下:

#[derive(Clone, Copy, Debug)]
struct Example2 {
nested: i64,
}

#[derive(Clone, Copy, Debug)]
struct Example {
field: i64,
nested: Example2,
}

fn usage() {
  let e = Example { field: 4 };
  let lens = gen_lens!(copy Example, field);
  let lens2 = gen_lens!(copy Example2, nested);
  let lens3 = gen_lens!(copy Example, field.nested);
  let lens4 = compose(lens, lens2);

  // Operations over lens3 and lens4 are semantically equivalent

许可证

除非另有声明,本项目的代码是在 Apache 软件许可证第 2 版下发布的。

贡献

本项目使用 GitHub Flow 方法进行贡献,这意味着我们非常欢迎您将补丁作为 GitHub 上的拉取请求发送给我们。如果您出于任何原因更愿意通过电子邮件发送补丁,它们也受欢迎,并将被整合到这里。

除非您明确声明,否则您提交给本项目作为贡献的任何有意包含的内容,根据 Apache-2.0 许可证的定义,将按上述方式许可,不附加任何额外条款或条件。

无运行时依赖