如何创建一个切片,而无需复制单个元素?

8

我有一个非常大的结构体(在堆栈上)在函数中使用。大多数情况下,我只需要该结构体的一个简单变量,因为我直接处理大的结构体。然而,在某个时候,由于函数签名的限制,我被迫将这个结构体放入了一个切片中。

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]应该具有相同的内存布局(被指对象,而不是指针),因此我期望有一种简单的方式将它们重新解释为另一个,但我还没有找到这样的功能。

1个回答

13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接