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

时间:2019-04-26 07:56:45

标签: rust slice

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

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 个答案:

答案 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