She*_*ter 10
在夜间Rust中,您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)
他们的arrayref crate实现了这一点.
这是一个例子,你当然可以用不同的方式使用它:
#[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]
}
Run Code Online (Sandbox Code Playgroud)
重新强调一下,如果没有不安全的代码,就无法做到这一点,因为直到运行时才知道切片中有三个元素.
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
}
}
Run Code Online (Sandbox Code Playgroud)
在实现const泛型之前,这在数组的长度上不是通用的.
| 归档时间: |
|
| 查看次数: |
1145 次 |
| 最近记录: |