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
文件夹。