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日 |
#460 在 Rust模式
每月357次下载
在 3 个crate中使用(通过 hollywood)
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"));
}