- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解借用检查器。我有一个带有签名的函数
fn SerializeChar(&mut self, value: &mut u8)
我想从 u8
和 i8
获取数据,因为我不关心符号:
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 toSerializeChar
similar to just casting in C++?
按以下顺序转换:
&mut i8
*mut i8
*mut u8
&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 u8
和 i8
都对任何 8 位位模式有效,即使语义值可能会改变,如 u8::MAX
变为 -1
。
综上所述,这并不意味着没有更好的方法来实现您的目标。作为Laney mentions ,您可以为有趣的类型创建特征并将不安全的代码隐藏在实现内部。这可以让您的用户避免不安全。
您还可以使用宏来创建多个相似的函数,但实际上它们并不相同。
可能还有更高级的方法来解决您的实际问题。为什么你必须改变这里的数据?连载似乎很不寻常。
关于rust - 如何将 &mut T 类型转换为 &mut U 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55176192/
Rust 中 *、&、mut、&mut、ref、ref mut 的用法和区别 在 Rust 中,*、ref、mut、& 和 ref mut 是用于处理引用、解引用和可变性的关
这个问题在这里已经有了答案: How to avoid writing duplicate accessor functions for mutable and immutable referenc
我正在尝试使用指向我的结构的指针调用 pthread_join,以便 C 线程可以将结构填充到我指向它的内存中。 (是的,我知道这是非常不安全的..) pthread_join的函数签名: pub u
这个问题在这里已经有了答案: is it possible to filter on a vector in-place? (4 个答案) Is there a way to drain parts
这个问题在这里已经有了答案: is it possible to filter on a vector in-place? (4 个答案) Is there a way to drain parts
以下代码编译失败,因为 MutRef 不是Copy。无法复制,因为&'a mut i32 不是Copy。有什么方法可以让 MutRef 具有与 &'a mut i32 相似的语义吗? 这样做的动机是能
我想转换数组。 例子: func()-> *mut *mut f32; ... let buffer = func(); for n in 0..48000 { buffer[0][n] =
我想对 &mut [u8] 进行一些操作。 在我的测试代码中我有: #[test] fn test_swap_bytes() { let input: &[u8] = b"abcdef";
首先,我不是在问 &mut 之间有什么区别?和 ref mut本身。 我问是因为我想: let ref mut a = MyStruct 与相同 let a = &mut MyStruct 考虑从函数
这个问题在这里已经有了答案: What's the difference between placing "mut" before a variable name and after the ":"
我正在从书中学习 Rust,并且我正在处理第 8 章末尾的练习,但是关于将单词转换为 Pig Latin 的练习我遇到了困难。我想具体看看我是否可以将 &mut String 传递给一个接受 &mut
这段代码: let mut a2 = 99; let b: *mut i32 = &mut a2; *b = 11; // does not compile , even after unsafe {
我正在尝试了解借用检查器。我有一个带有签名的函数 fn SerializeChar(&mut self, value: &mut u8) 我想从 u8 和 i8 获取数据,因为我不关心符号: let
在下面的示例中,t1 编译但 t2 不编译。 &mut &stream有什么特别之处吗?我认为 Deref 不会起作用。 use std::net::TcpStream; fn t1() {
我正在围绕 C 库编写一个 Rust 包装器,同时我正在尝试利用 The Book 中提到的“可空指针优化” , 但我找不到转换 Option 的好方法至 *const T和 Option至 *mut
我试图在 Rust 中实现一个链表,但我在理解这两个函数之间的区别时遇到了一些困难: enum List { Nil, Cons(T, Box>) } fn foo(list: &mu
根据文档,ManuallyDrop是一个零成本包装器。这是否意味着我可以取消引用指向 ManuallyDrop 的原始指针从原始指针转换为 T ? 最佳答案 ManuallyDrop 是 declar
我一直在尝试用 Rust 编写 Redis 模块。这是我第一次尝试使用 Rust FFI 和绑定(bind)。如何在不破坏 Redis 指针的情况下调用此方法并在 Rust 中得到一个数据值? ext
我很难理解以下代码为何具有2种不同的行为: pub fn get(&self, idx: usize) -> &T { let arr = unsafe { core::slice::from
在 documentation为 Unwindsafe我们有: Types such as &mut T and &RefCell are examples which are not unwind
我是一名优秀的程序员,十分优秀!