问题 `as`允许哪些演员阵容?


关于的Rust Book部分 as 操作者 目前说

as关键字执行基本的转换:

let x: i32 = 5;

let y = x as i64;

然而,它只允许某些类型的铸造。

那些是什么 某些种类 允许铸造?

这里的删除答案解释说,有时你需要连锁多个 as - 实现安全结果的预测,无法一步完成。什么时候需要?


2747
2017-11-24 01:54


起源

FWIW,Rust文档对表明增强功能的问题非常敏感。或者甚至更好,在这里回答并向文档提交PR以便每个人受益! - Shepmaster
是的,我打算这样做。 - poolie
开始于 github.com/rust-lang/rust/pull/30088 - poolie


答案:


我认为这不是很好,但是 这里 是您可能会发现有用的一些信息:

演员 e as U 如果满足下列条件之一,则有效:

  • e 有类型 T 和 T 胁迫 U; 强制铸
  • e 有类型 *TU 是 *U_0,或者 U_0: Sized 要么   unsize_kind(T)= unsize_kind(U_0); PTR-PTR-投
  • e 有类型 *T 和 U 是一种数字类型,而 T: Sized; PTR-地址铸
  • e 是一个整数和 U 是 *U_0,而 U_0: Sized; 地址-PTR-投
  • e 有类型 T 和 T 和 U 是任何数字类型; 数字播
  • e 是一个类似C的枚举和 U 是整数类型; 枚举投
  • e 有类型 bool 要么 char 和 U 是整数; 升麻INT-投
  • e 有类型 u8 和 U 是 char; U8-炭投
  • e 有类型 &[T; n] 和 U 是 *const T; 阵列-PTR铸
  • e 是一个函数指针类型和 U 有类型 *T,   而 T: Sized; FPTR-PTR-投
  • e 是一个函数指针类型和 U 是整数; FPTR-地址铸

哪里 &.T 和 *T 是可变性的参考,   和unsize_kind(T)是那种不合格的信息   在 T  - 特征定义的vtable(例如 fmt::Display 要么    Iterator不是 Iterator<Item=u8>)或长度(或 () 如果 T: Sized)。

请注意,在投射原始切片时不会调整长度 -    T: *const [u16] as *const [u8] 创建仅包含的切片   原始记忆的一半。

铸造不是传递性的,即使是 e as U1 as U2 是有效的   表达, e as U2 不一定是这样(事实上它只有在有效的情况下才有效    U1 胁迫 U2)。


7
2017-11-24 02:16



将整数强制转换为指针似乎不安全。也许这个清单已经过时了,因为医生说 as 只做安全演员表演(现在?) - poolie
@poolie:它仍然有效 [围栏链接]。将整数转换为指针并不安全,但取消引用指针是。 - Adrian


引自 Rustonomicon:演员

这是所有真实演员阵容的详尽列表。为简洁起见,我们将使用*来表示* const或* mut,并使用整数来表示任何整数原语:

  • * T为* U,其中T,U:大小
  • * T as * U TODO:解释未确定的情况
  • * T为整数
  • 整数为* T.
  • 数字作为数字
  • C-like-enum为整数
  • bool为整数
  • char为整数
  • u8作为char
  • &[T; n] as * const T.
  • fn as * T其中T:Sized
  • fn为整数

2
2017-11-25 03:29



该列表与已发布的列表有何不同? - Shepmaster
眼睛更容易阅读。 - Winger Sendon