我有一个非常大的结构体(在堆栈上)在函数中使用。大多数情况下,我只需要该结构体的一个简单变量,因为我直接处理大的结构体。然而,在某个时候,由于函数签名的限制,我被迫将这个结构体放入了一个切片中。
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]
应该具有相同的内存布局(被指对象,而不是指针),因此我期望有一种简单的方式将它们重新解释为另一个,但我还没有找到这样的功能。