gpt4 book ai didi

rust - 如何将 &mut T 类型转换为 &mut U 类型?

转载 作者:行者123 更新时间:2023-11-29 08:10:25 28 4
gpt4 key购买 nike

我正在尝试了解借用检查器。我有一个带有签名的函数

fn SerializeChar(&mut self, value: &mut u8)

我想从 u8i8 获取数据,因为我不关心符号:

let mut test: i8 = 0; 
thing.SerializeChar(&mut test); //Error: &mut u8 expected

很好,但我该如何施放呢?

&mut (test as u8) 不是一回事。是否有任何安全或不安全的方法将测试作为参数传递给 SerializeChar 类似于仅在 C++ 中进行转换?此外,我不想在执行时破坏 test,因为我仍然需要 test,并且仍然希望它作为 i8,而不是u8

我不是要克隆值。我想要 test 的地址,因为 SerializeChar 中的数据是可变的,需要修改放入的任何内容。在 C++ 术语中,我不想要 char,我想要一个*char,因为我需要修改内存中的8位。我有可能做两个单独的 SerializeChar 版本,但在此之前我想知道是否有可能实际做类似 *u8(test) 的借用检查器没关系。

最佳答案

首先,这与借用检查器无关。被告知一种类型与另一种类型不同是类型检查器的权限。

Is there any safe or unsafe way to pass test as an argument to SerializeChar similar to just casting in C++?

通过原始指针

按以下顺序转换:

  1. &mut i8
  2. *mut i8
  3. *mut u8
  4. &mut u8
fn serialize_char(value: &mut u8) {
*value = std::u8::MAX
}

fn main() {
let mut test: i8 = 0;
serialize_char(unsafe { &mut *(&mut test as *mut i8 as *mut u8) });
println!("{}", test); // -1
}

另见:

转化

使用 as 应该始终是您的第一次尝试,但还有 transmute 的大锤子.与更简单的 as 强制转换序列相比,这允许您做各种坏事,并且在有替代方案时不受青睐:

use std::mem;

fn serialize_char(value: &mut u8) {
*value = std::u8::MAX
}

fn main() {
let mut test: i8 = 0;
serialize_char(unsafe { mem::transmute(&mut test) });
println!("{}", test); // -1
}

另见:

安全

通过 as 进行的所有转换都是安全的,尽管它们可能会产生虚假或意外的数据。

*mut u8 转换为&mut u8 或使用transmute 是不安全的,因为程序员必须确保:

  • 遵守引用规则
  • 所有的值都有其类型的有效值

我们知道引用是有效的:仍然只有一个可变引用,它指向实时数据。

A u8i8 都对任何 8 位位模式有效,即使语义值可能会改变,如 u8::MAX 变为 -1


综上所述,这并不意味着没有更好的方法来实现您的目标。作为Laney mentions ,您可以为有趣的类型创建特征并将不安全的代码隐藏在实现内部。这可以让您的用户避免不安全。

您还可以使用宏来创建多个相似的函数,但实际上它们并不相同。

可能还有更高级的方法来解决您的实际问题。为什么你必须改变这里的数据?连载似乎很不寻常。

关于rust - 如何将 &mut T 类型转换为 &mut U 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55176192/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com