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

如何在Rust中获得切片作为阵列?

谢志文
2023-03-14

我有一个大小未知的数组,我想获取该数组的一个切片,并将其转换为静态大小的数组:

fn pop(barry: &[u8]) -> [u8; 3] {
    barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}

我该怎么做?

共有3个答案

田昊天
2023-03-14

这里有一个与您要求的类型签名匹配的函数。

fn pop(barry: &[u8]) -> [u8; 3] {
    [barry[0], barry[1], barry[2]]
}

但是由于barry的元素可能少于三个,因此您可能需要返回一个选项

fn pop(barry: &[u8]) -> Option<[u8; 3]> {
    if barry.len() < 3 {
        None
    } else {
        Some([barry[0], barry[1], barry[2]])
    }
}

孔俊捷
2023-03-14

感谢@malbarbo,我们可以使用此帮助功能:

use std::convert::AsMut;

fn clone_into_array<A, T>(slice: &[T]) -> A
where
    A: Default + AsMut<[T]>,
    T: Clone,
{
    let mut a = A::default();
    <A as AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
    a
}

要获得更简洁的语法,请执行以下操作:

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

    let e = Example {
        a: clone_into_array(&original[0..4]),
        b: clone_into_array(&original[4..10]),
    };

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

只要T:默认克隆

如果您知道您的类型实现了复制,则可以使用以下表单:

use std::convert::AsMut;

fn copy_into_array<A, T>(slice: &[T]) -> A
where
    A: Default + AsMut<[T]>,
    T: Copy,
{
    let mut a = A::default();
    <A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
    a
}

两种变体都将panic 如果目标数组和传入的切片的长度不相同。

邓欣德
2023-03-14

您可以使用TryIntotrait(稳定在Rust 1.34中)轻松做到这一点:

use std::convert::TryInto;

fn pop(barry: &[u8]) -> [u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

但更好的是:不需要克隆/复制您的元素!实际上可以得到一个

fn pop(barry: &[u8]) -> &[u8; 3] {
    barry.try_into().expect("slice with incorrect length")
}

正如在其他答案中提到的,如果barry的长度不是3,您可能不想惊慌失措,而是要优雅地处理此错误。

这要归功于来自的相关特性尝试的这些impl(在Rust 1.47之前,这些仅适用于长度不超过32的阵列):

impl<'_, T, const N: usize> TryFrom<&'_ [T]> for [T; N]
where
    T: Copy, 

impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]

impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]

 类似资料:
  • 我在Rust中有一个,我需要在接受切片的函数中使用它。如何从一个中获取一个切片,其中的切片有一个元素,而的切片有零个元素?

  • 问题内容: 有什么有效的方法来获取Go中两个切片的交集吗? 我想避免嵌套for循环之类的解决方案 字符串顺序无关紧要 问题答案: 是的,有几种不同的解决方法。.这是一个可以优化的示例。 现在上面定义的交集方法将只运行在的,比如你的例子。您可以在理论上创建一个定义,这个样子的,但是你会依靠反射和类型转换,这样就可以比较,这将增加延迟和使您的代码更难阅读。对于您关心的每种类型,维护和阅读以编写单独的函

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中

  • 问题内容: 提取切片的最后一个元素的Go方法是什么? 上面的解决方案有效,但看起来很尴尬。 问题答案: 仅读取切片的最后一个元素: 要删除它: 参见此页面有关切片技巧

  • 我有过 我想要 在JS我可以做 作为许多类似这样的简单方法之一 围棋里有这样的东西吗?

  • 问题内容: 我从CSV文件加载了一些机器学习数据。前两列是观察值,其余两列是要素。 目前,我执行以下操作: 它给出了类似的东西: 我想两个dataframes切片此数据框:包含列一个和和包含一个列,和。 不可能写这样的东西 我不确定最好的方法是什么。我需要吗? 顺便说一下,我发现数据帧索引非常不一致:允许,但不允许。另一方面,不允许,但允许。是否有实际原因?如果列是由Int索引的,这确实令人困惑,