rust - 有没有办法为与底层存储不匹配的类型创建可变引用?
问题描述
考虑一个实现为[u8; 2]
. 是否可以构造&mut u16
对整个结构的可变引用?有安全的方法吗?
作为表达这一点的另一种方式,有没有一种方法可以实现:
fn ref_all(&mut [u8; 2]) -> &mut u16
有没有办法为自定义类型做这个?
解决方案
没有完全安全的方法可以做到这一点,但是为切片定义了align_to_mut
(及其不可变的对应物align_to
),它适用于所有类型,并且是比大锤子更安全的替代方案mem::transmute
:
fn ref_all(x: &mut [u8; 2]) -> &mut u16 {
let (prefix, chunks, suffix) = unsafe {x.align_to_mut::<u16>()};
// you don't need these asserts but know that chunks might not always have an element
assert!(prefix.is_empty());
assert!(suffix.is_empty());
assert_eq!(chunks.len(), 1);
&mut chunks[0]
}
对于u16
s,这应该没问题,尽管由于数字的字节顺序,它可能会导致依赖于架构的行为。对于其他类型,这样做会非常冒险。
推荐阅读
- ruby - 我们可以在 ruby 2.7.0 中安装 C gems
- azure - 'az functionapp deployment' 报告成功,但 Azure 中的 Functions 视图为空
- c# - CoverFlowView [Xamarin Forms iOS] 内未显示灰度图像
- firebase - 反应原生火炉
- python - 将熊猫数据框中的无效日期转换为最近的有效日期
- python - Altair Chart 从 TimeStamps 中“读取”的信息超出其应有的范围
- reactjs - 如何使用样式组件覆盖 .styl 文件中的属性?
- java - 使用没有循环和乘法的递归调用来查找值
- datepicker - 给定 UTC 日期,您如何正确设置 Adaptive Card - Date Picker 的值?
- ios - 如何从 TableViewCell 中的单元格激活滑块 IBAction?