#tuple #recursively #unzip #results #unzipping #left #options

zipped

递归解压缩元组、元组的 Option 和元组的 Result 的实用工具

1 个不稳定版本

0.1.0 2022 年 12 月 4 日

#2015 in Rust 模式

MIT 许可证

11KB
111

Zipped

递归解压缩元组、元组的 Option 和元组的 Result 的实用工具。

安装

cargo add zipped

用法

这个软件包非常简单。

解压缩 (((A, B), C), ...)

如果你有一个左递归或右递归压缩的元组,你可以使用 UnzipInto::unzip_into 来将其转换为非递归元组。这适用于最多 26 个元组元素。

use zipped::UnzipInto;

let (a, b, c) = ((1, 2), 3).unzip_into(); // left-recursive
let (a, b, c) = (1, (2, 3)).unzip_into(); // right-recursive

解压缩 Option<(((A, B), C), ...)>

如果你有一个包含左递归或右递归压缩元组的 Option,你也可以使用 UnzipInto::unzip_into 来将其转换为非递归元组的 Option。这也适用于最多 26 个元组元素。

use zipped::UnzipInto;

let zipped = Some(1).zip(Some(2)).zip(Some(3));

match zipped.unzip_into() {
    Some((a, b, c)) => {}
    None => {}
}

虽然也可以解压缩包含右递归压缩元组的 Option,但这些不会自然出现,因为 Option::zip 是左递归的。

解压缩 Result<(((A, B), C), ...), E>

如果您有一个包含左递归或右递归压缩元组的 Result,您还可以使用 UnzipInto::unzip_into 将其转换为非递归元组的 Result。这也适用于最多26个元素。

use zipped::UnzipInto;

let zipped = Ok::<_, ()>(1)
    .and_then(|a| Ok((a, 2)))
    .and_then(|ab| Ok((ab, 3)));

match zipped.unzip_into() {
    Ok((a, b, c)) => {}
    Err(_) => {}
}

同样,虽然也可以解压包含右递归压缩元组的 Result,但我发现这种情况很少发生。

限制

  • 类型推断。 编译器无法自动推断 TUnzipInto<T> 中的类型。最终,您需要指定返回值的元数。
  • 最大元数。 UnzipFrom 已为最多26个元素的元组实现。
  • 严格。 它只适用于完全压缩的元组,其中每个元组包含2个元素,并且只有左(或右)元素可以再是元组,即它不适用于 ((A, B), C, D)

许可证

版权所有 2022 Glacyr B.V.

特此授予任何获得此软件及其相关文档文件(“软件”)副本的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供者提供软件的人行使上述权利,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论该责任是基于合同、侵权或其他原因,以及该软件的产生、存在或与软件的使用或其他方式相关。

无运行时依赖