gpt4 book ai didi

rust - 如何在不复制该元素的情况下从单个元素创建切片?

转载 作者:行者123 更新时间:2023-11-29 07:59:20 24 4
gpt4 key购买 nike

我在函数中使用了一个非常大的结构(在堆上和堆栈上)。大多数时候,我想要那个结构的一个简单变量,因为我直接用大结构做事。然而,有一次,我被迫(通过函数签名)将此结构传递到切片内部。

struct VeryBig(Vec<String>, [u64; 50]);

fn takes_slice(_: &[VeryBig]) {}

fn main() {
let foo = VeryBig(vec!["Ferris".to_string(); 100], [27; 50]);

// Use `foo` directly a bunch of times

takes_slice(&foo); // <-- mismatched type

// Use `foo` directly a bunch of times
}

这显然会导致此错误,这是可以理解的:

error[E0308]: mismatched types
--> src/main.rs:10:17
|
10 | takes_slice(&foo); // <-- mismatched type
| ^^^^ expected slice, found struct `VeryBig`
|
= note: expected type `&[VeryBig]`
found type `&VeryBig`

所以我想知道:解决这个问题的最佳方法是什么?我可以foo成为[VeryBig; 1],但这意味着我必须在任何我想直接使用大结构的地方使用 foo[0]——这很烦人。或者,我可以将大结构临时放入数组中,调用 takes_slice 并再次将其移出数组。但这也不是很好。

据我所知,&T&[T] 应该有相同的内存布局(指针,而不是指针),所以我希望有一种轻松地将一个重新解释为另一个的方法,但我还没有找到这样的功能。

最佳答案

您可以使用 slice::from_ref .

fn from_ref<T>(s: &T) -> &[T]

在您的代码中(Playground):

use std::slice;

takes_slice(slice::from_ref(&foo));

对于可变切片,您可以使用 slice::from_mut .另见 this question关于那个话题。

参见 How can I convert a reference to any type to a reference to an array of length 1?对于数组。

关于rust - 如何在不复制该元素的情况下从单个元素创建切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863195/

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