7 个版本
| 0.1.0-alpha.13 | 2024 年 6 月 10 日 |
|---|---|
| 0.1.0-alpha.12 | 2024 年 5 月 4 日 |
| 0.1.0-alpha.11 | 2023 年 6 月 30 日 |
| 0.1.0-alpha.10 | 2023 年 4 月 24 日 |
| 0.1.0-alpha.4 |
|
#2504 in Rust 模式
808 每月下载
用于 unsized-vec
65KB
1K SLoC
emplacable
通过类似 placement new 的机制,从函数中返回无尺寸类型(如 [i32] 或 dyn Any)的值。
为支持 unsized-vec 软件包而编写,但与之独立。实验性,需要 nightly Rust。
lib.rs:
支持返回无尺寸值的函数的机制。
为支持 unsized-vec 软件包而编写,但与之独立。需要 nightly Rust。
无尺寸值可以有多种形式
-
在 stable Rust 中,无尺寸类型(如
str],[u8], 和dyn Any)的值通常出现在指针后面,如&str或Box<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]替换为任何一对类型(T,U),使得T: Unsize<U>。
关于示例的说明
由于这个crate提供了与无尺寸类型一起工作的工具,但没有使用这些工具的有趣功能,因此它只有很少的示例。如果你想了解更多使用示例,请查看unsized-vec的文档和GitHub上的examples文件夹。