9个版本 (重大更新)

0.7.1 2024年7月19日
0.7.0 2024年7月18日
0.6.0 2024年7月16日
0.5.0 2024年5月10日
0.1.0 2023年9月13日

#460Rust模式

Download history 4/week @ 2024-04-22 1/week @ 2024-04-29 110/week @ 2024-05-06 8/week @ 2024-05-13 43/week @ 2024-05-20 23/week @ 2024-05-27 39/week @ 2024-06-03 4/week @ 2024-06-10 214/week @ 2024-06-17 90/week @ 2024-06-24 41/week @ 2024-07-01 343/week @ 2024-07-15 10/week @ 2024-07-22 4/week @ 2024-07-29

每月357次下载
3 个crate中使用(通过 hollywood

MIT/Apache

10KB
73

关于

本crate力求实现线性类型

Linear<T> 类型封装了一个 T。线性类型不能被丢弃,而最终必须被消费。线性类型上可用的方法只有少数几个。

  • new() 创建一个新的线性类型。
  • into_inner() 解构一个对象,返回非线性类型的内部值。
  • map() 将一个 FnOnce 应用于解构后的内部类型,生成另一个线性类型。
  • map() 的某些变体用于处理 Linear<Result<T,E>>Linear<Option<T>>
  • Linear<Result<T,E>>Linear<Option<T>> 支持几种形式的 unwrap()

Pin 不同,线性类型可以移动,而与 ManuallyDrop 不同,线性类型最终必须被解构并消费。

状态

这个crate始于IRC上的讨论。它没有实现纯线性类型理论,因为这需要语言支持。将其视为一个概念验证。它可能有一些用途,并且在使用Rust的情况下应该是安全的。欢迎改进和PR。在发布1.0版本之前,这个crate可能会有些变动。

特性标志

  • drop_unchecked

    当此crate使用drop_unchecked特性标志进行编译时,在发布版本中,释放线性类型时将不会按照预期引发panic。不会强制执行线性类型语义。这违背了此crate的目的。它只提供了微小的空间和性能提升。应将其视为UB,并且仅在需要时在经过彻底验证和测试的程序上启用。

示例

虽然任何类型都可以被Linear<T>封装,但建议将其与过渡到最终状态的唯一新类型一起使用。状态转换可以是函数或闭包。

use linear_type::Linear;
use std::fs::File;
use std::io::{Read, Result};

// define some newtypes for the states
struct Filename(&'static str);
#[derive(Debug)]
struct ReadonlyFile(File);
#[derive(Debug)]
struct FileContent(String);

// define functions that transition from one state to the next.
fn open_file(Filename(name): Filename) -> Result<ReadonlyFile> {
    Ok(ReadonlyFile(File::open(name)?))
}

fn read_text(ReadonlyFile(mut file): ReadonlyFile) -> Result<FileContent> {
    let mut text = String::new();
    file.read_to_string(&mut text)?;
    Ok(FileContent(text))
}

fn main() {
    // Create a linear type and transition through the states
    let file_content = Linear::new(Filename("README.md"))
        .map(open_file)
        .map_ok(read_text)
        .unwrap_ok();

    // destructure the file content
    let FileContent(text) = file_content.into_inner();
    assert!(text.contains("# Example"));
}

无运行时依赖

特性