我在函数中使用了一个非常大的结构(在堆和堆栈上)。大多数时候,我想要一个简单的结构变量,因为我直接用大结构进行操作。但是,在某一时刻,我被迫(通过函数签名)将此结构传递给切片内部。
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]
应该具有相同的内存布局(指针,而不是指针),因此我希望有一种方法可以轻松地将彼此重新解释,但我还没有找到这样的功能。
答案 0 :(得分:2)
您可以使用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。