7 个版本

0.1.0-alpha.132024 年 6 月 10 日
0.1.0-alpha.122024 年 5 月 4 日
0.1.0-alpha.112023 年 6 月 30 日
0.1.0-alpha.102023 年 4 月 24 日
0.1.0-alpha.4 2022 年 10 月 30 日

#2504 in Rust 模式

Download history 1/week @ 2024-04-26 197/week @ 2024-05-03 2/week @ 2024-05-10 7/week @ 2024-05-17 1/week @ 2024-05-24 117/week @ 2024-06-07 17/week @ 2024-06-14 1/week @ 2024-06-21 3/week @ 2024-06-28 32/week @ 2024-07-05

808 每月下载
用于 unsized-vec

MIT/Apache

65KB
1K SLoC

emplacable

docs.rs Crates.io

通过类似 placement new 的机制,从函数中返回无尺寸类型(如 [i32]dyn Any)的值。

为支持 unsized-vec 软件包而编写,但与之独立。实验性,需要 nightly Rust。


lib.rs:

支持返回无尺寸值的函数的机制。

为支持 unsized-vec 软件包而编写,但与之独立。需要 nightly Rust。

无尺寸值可以有多种形式

  • 在 stable Rust 中,无尺寸类型(如 str], [u8], 和 dyn Any)的值通常出现在指针后面,如 &strBox<dyn Any>.

  • 夜间Rust通过使用unsized_fn_params特性,提供了对按值传递无尺寸值作为函数参数的有限支持。还有unsized_locals,用于通过alloca在堆栈上存储这些值。(然而,该特性是“不完整的”,并且这个crate没有使用它)。但是,即使启用了这两个特性门,函数也不能直接返回无尺寸值。另外,在今天的Rust中,产生按值传递的无尺寸值的唯一方法是通过解引用一个Box;这个crate提供了unsize宏来解决这个问题。

  • 对于返回无尺寸值的函数,这个crate提供了Emplacable类型。想要返回类型为T的值的函数,其中T是无尺寸的,返回一个Emplacable<T, _>Emplacable<T>封装了一个闭包;这个闭包包含将T写入调用者提供的内存区域的指令。其他函数接受Emplacable作为参数,并调用其包含的闭包将T写入它们提供的某些分配中。例如,这个crate提供了box_new_with函数,它将一个Emplacable<T>转换为一个Box<T>

类型之间的转换

我有 我想 我可以使用
[i32; 2] [i32] unsize
[i32; 2] Emplacable<[i32; 2], _> Into::into
[i32] Emplacable<[i32], _> with_emplacable_for
[i32] Box<[i32]> box_new
Box<[i32; 2]> Box<[i32]> CoerceUnsized
Box<[i32]> [i32] 使用*解引用box
Box<[i32]> Emplacable<[i32], _> Into::into
Vec<i32> Emplacable<[i32], _> Into::into
Emplacable<[i32; 2], _> [i32; 2] Emplacable::get
Emplacable<[i32; 2], _> Emplacable<[i32], _> Into::into
Emplacable<[i32; 2], _> Emplacable<dyn Debug,_> Emplacable::unsize
Emplacable<[i32], _> Box<[i32]> box_new_with
Emplacable<[i32], _> Vec<i32> Into::into
Emplacable<[i32], _> Rc<[i32]> Into::into
Emplacable<[i32], _> Arc<[i32]> Into::into
&[i32] Box<[i32]> Into::into
&[i32] Emplacable<[i32], _> Into::into

你可以将上面的[i32; 2][i32]替换为任何一对类型(TU),使得T: Unsize<U>

关于示例的说明

由于这个crate提供了与无尺寸类型一起工作的工具,但没有使用这些工具的有趣功能,因此它只有很少的示例。如果你想了解更多使用示例,请查看unsized-vec的文档和GitHub上的examples文件夹。

无运行时依赖

特性