如何从单个元素创建切片而不复制该元素?

Luk*_*odt 9 slice rust

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

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 的数组的引用?对于数组。