我有一个大小未知的数组,我想获取该数组的一个切片,并将其转换为静态大小的数组:
fn pop(barry: &[u8]) -> [u8; 3] {
barry[0..3] // expected array `[u8; 3]`, found slice `[u8]`
}
我该怎么做?
这里有一个与您要求的类型签名匹配的函数。
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]])
}
}
感谢@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
如果目标数组和传入的切片的长度不相同。
您可以使用TryInto
trait(稳定在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索引的,这确实令人困惑,