Pointers 如何通过“多次”转换原始str;作为「;工作?

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

这是我在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 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
    *mut U
    (T和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
    实际上与
    [u8]
    具有相同的表示形式,但只有一部分值是有效的(正确的UTF-8值)
有趣的是,一个是安全的,另一个不是:

  • 由于所有
    str
    都是
    [u8]
    ,因此从
    *str
    转换为
    *[u8]
    总是安全的
  • 但是,公开
    &mut[u8]
    允许破坏
    str
    中的不变量,因此
    作为
    字节
    是不安全的

在Rust中,
as
操作员允许一次一步转换

允许进行一些转换,例如:

  • &T
    *常数T
  • &mut T T
    *mut T T
  • *mut T T
    *mut U
    (T和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
    实际上与
    [u8]
    具有相同的表示形式,但只有一部分值是有效的(正确的UTF-8值)
有趣的是,一个是安全的,另一个不是:

  • 由于所有
    str
    都是
    [u8]
    ,因此从
    *str
    转换为
    *[u8]
    总是安全的
  • 但是,公开
    &mut[u8]
    允许破坏
    str
    中的不变量,因此
    作为
    字节
    是不安全的

这是两步转换吗?我很难想象它还能是什么。。。您还看到了哪些其他可能性?请注意,严格来说,这并不是一种转换:数据不会被它修改,编译器也不会为它发出任何代码。这更像是一种重新解释:它改变了编译器查看数据的方式以及可以应用于数据的操作集,而不改变数据本身。这是一种两步转换吗?我很难想象它还能是什么。。。您还看到了哪些其他可能性?请注意,严格来说,这并不是一种转换:数据不会被它修改,编译器也不会为它发出任何代码。它更像是一种重新解释:它改变了编译器查看数据的方式以及可以应用于数据的操作集,而不改变数据本身。