我有一个非常大的结构(在堆上和堆栈上),我在函数中使用。大多数时候,我想要该结构的一个简单变量,因为我直接对大结构进行操作。然而,在某一时刻,我被迫(通过函数签名)将此结构传递到切片内部。
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
}
Run Code Online (Sandbox Code Playgroud)
这显然并且可以理解地导致了这个错误:
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`
Run Code Online (Sandbox Code Playgroud)
所以我想知道:解决这个问题的最佳方法是什么?我可以只制作foo一个[VeryBig; 1],但这意味着我必须在foo[0]我想直接使用大结构的任何地方使用 - 烦人。或者,我可以将大结构暂时放入数组中,takes_slice再次调用并将其移出数组。但这也不太好。
据我所知,&T和&[T]应该具有相同的内存布局(受指点,而不是指针),所以我希望有一种方法可以轻松地将一个重新解释为另一个,但我还没有找到这样的功能。
Luk*_*odt 14
您可以使用slice::from_ref。
fn from_ref<T>(s: &T) -> &[T]
在您的代码(Playground)中:
use std::slice;
takes_slice(slice::from_ref(&foo));
Run Code Online (Sandbox Code Playgroud)
对于可变切片,您可以使用slice::from_mut. 另请参阅有关该主题的问题。
请参阅如何将对任何类型的引用转换为对长度为 1 的数组的引用?对于数组。
| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |