Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将切片转换为数组引用?_Arrays_Rust_Slice - Fatal编程技术网

Arrays 如何将切片转换为数组引用?

Arrays 如何将切片转换为数组引用?,arrays,rust,slice,Arrays,Rust,Slice,我有一个&[u8],希望不复制就将其转换为&[u8;3]。它应该引用原始数组。我怎样才能做到这一点?再次强调,如果没有不安全的代码,就无法做到这一点,因为直到运行时,您才知道切片中有三个元素 fn slice_to_arr3<T>(slice: &[T]) -> Option<&[T; 3]> { if slice.len() == 3 { Some(unsafe { &*(slice as *const [T] as

我有一个
&[u8]
,希望不复制就将其转换为
&[u8;3]
。它应该引用原始数组。我怎样才能做到这一点?

再次强调,如果没有不安全的代码,就无法做到这一点,因为直到运行时,您才知道切片中有三个元素

fn slice_to_arr3<T>(slice: &[T]) -> Option<&[T; 3]> {
    if slice.len() == 3 {
        Some(unsafe { &*(slice as *const [T] as *const [T; 3]) })
    } else {
        None
    }
}
fn切片到arr3(切片:&[T])->选项{
如果slice.len()==3{
一些(不安全的{&*(切片为*const[T]as*const[T;3]))
}否则{
没有一个
}
}
在实现之前,这不能在整个阵列长度上通用。

他们板条箱实现了这一点

下面是一个例子,您当然可以以不同的方式使用它:

#[macro_use]
extern crate arrayref;

/// Get the first 3 elements of `bytes` as a reference to an array
/// **Panics** if `bytes` is too short.
fn first3(bytes: &[u8]) -> &[u8; 3] {
     array_ref![bytes, 0, 3]
}

从Rust 1.34开始,您可以使用
TryFrom
/
TryInto

use std::convert::TryFrom;

fn example(slice: &[u8]) {
    let array = <&[u8; 3]>::try_from(slice);
    println!("{:?}", array);
}

fn example_mut(slice: &mut [u8]) {
    let array = <&mut [u8; 3]>::try_from(slice);
    println!("{:?}", array);
}
使用std::convert::TryFrom;
fn示例(切片:&[u8]){
let array=::try_from(slice);
println!(“{:?}”,数组);
}
fn示例_mut(切片:&mut[u8]){
let array=::try_from(slice);
println!(“{:?}”,数组);
}

[&x[0]、&x[1]、&x[2]]
?这是一个[&u8;3]。你为什么需要它?另请看相关但不同的句子,我会对“这不安全”这句话进行质疑。这绝对是安全的-只要你检查切片的长度。如果它实际上永远不可能是安全的,那么它就不应该被写在第一位。这是一个迂腐的论点,但“安全”的概念对于锈迹斑斑的新来者来说已经够模糊了,我觉得值得指出。他的意思可能是“这不可能是不安全的”。是的,我同意。也许更好的措辞是,没有不安全的代码就做不到。按照这种逻辑,“没有不安全的代码”就做不到任何事情,因为stdlib必然需要不安全的代码,任何人在内部使用的东西都有不安全的代码。我认为正确的说法是“这个问题没有完全的解决办法”;任何解决方案都必须是局部的,并考虑到错误情况,即切片至少没有3个元素,不知何故,@Zorf我喜欢使用的措辞是在安全和可靠之间划出一条界线。代码是不安全的,因为您必须使用
unsafe
关键字,这是无法避免的。但这是合理的,因为我们检查了片的长度,编译器相信我们会这样做。如果要将其传递到需要此类参数的函数中,还可以使用
try_into().unwrap()
,以避免需要写出数组类型,并且如果您确定片足够大的话。