gpt4 book ai didi

rust - 无需克隆即可安全地将新类型切片转换为内部变体

转载 作者:行者123 更新时间:2023-12-03 11:25:59 25 4
gpt4 key购买 nike

考虑以下示例
(playground link):

struct Wrapper(String);

async fn foo(my_slice: &[Wrapper]) {
bar(my_slice).await; // Error!
}

async fn bar(string_slice: &[String]) { ... }
我写作有困难 foo这样我就可以调用 bar(my_slice)不克隆 my_slice ,如 String未实现 Copy .
我知道这样做的不安全方法:放置 #[repr(transparent)]Wrappermem::transmute它,但我正在寻找在完全安全的 Rust 中执行此操作的方法。
我试图实现 From ,但是切片因为总是被认为是外来类型,因此我遇到了禁止我这样做的孤儿规则(外来类型的外来特征实现)。
可惜我只能修改 fooWrapperbar是自动生成的。
有什么方法可以安全投 &[Wrapper]&[String]没有克隆?

最佳答案

不,类型系统没有谓词来表示“可以安全地转换”的思想,所以如果你的类型不是编译器本身可以强制的,你必须使用 unsafe这样做。
但是,您不应该使用 transmute对于什么是有效的指针转换。相反,将切片分解为指针和长度,并使用目标类型创建一个新切片。

#[repr(transparent)]
struct Wrapper(String);

async fn foo(my_slice: &[Wrapper]) {
let my_slice =
unsafe { std::slice::from_raw_parts(my_slice.as_ptr() as *const String, my_slice.len()) };
bar(my_slice).await;
}
这比使用 transmute 稍微详细一些。 ,但它所能做的也更有限。 transmute是一种通用工具,需要比平时更多的护理;将其保存在简单强制转换不起作用的情况下。

I'm looking for ways to do this in entirely safe Rust.


坚持安全的 Rust 通常是个好主意。但是,从不使用 unsafe意味着放弃一定程度的性能和灵 active ,以换取在这种情况下不必考虑太多。这看起来像是对 unsafe 的完美使用。对我来说:它可以封装在一个微小的、安全的函数中,而且很容易证明是正确的。但是如果你决心避免 unsafe那么就没有办法了 clone项目。

关于rust - 无需克隆即可安全地将新类型切片转换为内部变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63174974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com