当前位置: 首页 > 知识库问答 >
问题:

函数从片[复制]构建固定大小的数组

楚苏燕
2023-03-14

相关:切片到固定大小的数组,但是我正在寻找更具体的形式。

理想情况下,我希望构建一个具有以下签名的函数:

fn make_array<T; N>(slice: &[T]) -> [T; N];

因为这还不可能(因为非类型参数不是一件事),所以我不想让函数直接接受数组:

fn make_array<A>(slice: &[T]) -> A;

[T;N]代替A

以下是我迄今为止最有希望的尝试:

use std::ops::DerefMut;

fn make_array<A, T>(slice: &[T]) -> A
    where A: Sized + Default + DerefMut<Target = [T]>
{
    let mut a = Default::default();
    (&mut a[..]).copy_from_slice(slice);
    a
}

fn main() {
    let original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let a: [u8; 4] = make_array(&original[0..4]);

    println!("{:?}", a);
}

然而,我错过了允许数组强制切片的特性(提示:这不是DerefMut)。

只要我同意函数只适用于小数组,有没有办法使用安全代码构建这样的函数?

共有1个答案

鲜于峰
2023-03-14

AsMut(或BorrowMut)工作:

use std::convert::AsMut;

fn make_array<A, T>(slice: &[T]) -> A
    where A: Sized + Default + AsMut<[T]>,
          T: Copy
{
    let mut a = Default::default();
    // the type cannot be inferred!
    // a.as_mut().copy_from_slice(slice);
    <A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
    a
}
 类似资料:
  • 我有一个结构与一些固定大小的数组: 我从一个文件中读取字节到一个固定大小的数组中,并将这些字节逐位复制到结构中。 最后一行()不起作用,因为在结构中它是一个,而是一个切片。我是否可以返回将一个片转换为一个固定大小的数组,就像在一个范围内那样,而不是像我所做的那样说?

  • 问题内容: 在Swift中,我试图创建一个由64个SKSpriteNode组成的数组。我想先将其初始化为空,然后将Sprites放在前16个单元格中,然后将最后16个单元格中(模拟象棋游戏)。 根据我在文档中了解的内容,我期望会出现以下情况: 要么 但这是行不通的。在第二种情况下,我收到一条错误消息:“尚不支持定长数组”。那可以是真的吗?对我来说,这听起来像是一项基本功能。我需要通过它们的索引直接

  • 问题内容: 我想用Java创建一个Stack,但是要固定大小。例如,创建一个新的堆栈,将大小设置为10,然后在将项目推入堆栈时将其填满,并在将其填满到十时将堆栈中的最后一个项目推出(移出)。我想使用Stack,因为它使用LIFO,非常适合我的需求。 但是Stack从Vector继承的setSize()方法似乎并没有真正限制Stack的大小。我想我缺少有关堆栈如何工作的信息,或者堆栈并不是要受到约束

  • 问题内容: 我正在尝试将固定大小的数组转换为可变大小的数组(切片): 但是编译器抛出错误: 我应该如何转换? 问题答案: 使用让您在阵列上切片。另请参阅此博客文章,以获取有关数组和切片的更多信息。

  • 好吧,这看起来有点傻,但是我很难找到一个函数来从切片的内容返回静态大小的数组。 关于阵列和切片的铁锈书章节对此一无所知。(它确实显示了如何从数组中获取切片,但我想换一种方式。)我还检查了和的文档,但是如果它在那里,我就看不到它了。 当然,可以一个接一个地写下每个元素,但这似乎很荒谬。现在,我最终写了一个python单行线来为我做这件事。 所以我最后得到了这个: 我想知道是否有合适的方法,比如或者类

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对