Pointers 如何通过“多次”转换原始str;作为「;工作?
这是我在Rust's找到的。我很难理解Pointers 如何通过“多次”转换原始str;作为「;工作?,pointers,rust,type-conversion,Pointers,Rust,Type Conversion,这是我在Rust's找到的。我很难理解&mut*(self as*mut str as*mut[u8])和self as*const str as*const u8 这是两步转换吗?首先转换为*mut str或*const str,然后转换为*mut[u8]或*const u8 #[stable(feature = "str_mut_extras", since = "1.20.0")] #[inline(always)] pub unsafe fn as_bytes_mut(&mut
&mut*(self as*mut str as*mut[u8])
和self as*const str as*const u8
这是两步转换吗?首先转换为*mut str
或*const str
,然后转换为*mut[u8]
或*const u8
#[stable(feature = "str_mut_extras", since = "1.20.0")]
#[inline(always)]
pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8] {
&mut *(self as *mut str as *mut [u8])
}
#[stable(feature = "rust1", since = "1.0.0")]
#[inline]
pub const fn as_ptr(&self) -> *const u8 {
self as *const str as *const u8
}
在Rust中,
as
操作员允许一次一步转换
允许进行一些转换,例如:
至&T
*常数T
至&mut T T
*mut T T
至*mut T T
(T和U上的某些条件待定)*mut U
as
两次将&mut T T
转到*mut T T
到*mut U
,也不能直接从&mut T T
转到*mut U
;这两个原因都是因为编译器和人类很难找出中间步骤
那么,这个转换序列是关于什么的
- 从引用到指针:典型的
到&T
,或*const T
变体mut
- 从指针指向
到指针指向str
:一个典型的[u8]
到*常数T
,用于一个等式*常数U
和T
U
实际上与str
具有相同的表示形式,但只有一部分值是有效的(正确的UTF-8值)[u8]
- 由于所有
都是str
,因此从[u8]
转换为*str
总是安全的*[u8]
- 但是,公开
允许破坏&mut[u8]
中的不变量,因此str
作为
是不安全的字节
as
操作员允许一次一步转换
允许进行一些转换,例如:
至&T
*常数T
至&mut T T
*mut T T
至*mut T T
(T和U上的某些条件待定)*mut U
as
两次将&mut T T
转到*mut T T
到*mut U
,也不能直接从&mut T T
转到*mut U
;这两个原因都是因为编译器和人类很难找出中间步骤
那么,这个转换序列是关于什么的
- 从引用到指针:典型的
到&T
,或*const T
变体mut
- 从指针指向
到指针指向str
:一个典型的[u8]
到*常数T
,用于一个等式*常数U
和T
U
实际上与str
具有相同的表示形式,但只有一部分值是有效的(正确的UTF-8值)[u8]
- 由于所有
都是str
,因此从[u8]
转换为*str
总是安全的*[u8]
- 但是,公开
允许破坏&mut[u8]
中的不变量,因此str
作为
是不安全的字节