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

poo*_*lie 11 casting rust

as运营商的Rust Book部分目前说

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

let x: i32 = 5;

let y = x as i64;
Run Code Online (Sandbox Code Playgroud)

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

什么是那些特定种类的允许铸造的?

这里删除的答案解释说,有时您需要链接多as播以实现安全结果,这不能在一个步骤中完成.什么时候需要?

Adr*_*ian 7

我不认为这是非常好的记录,但这里有一些你可能会觉得有用的信息:

e as U如果下列之一成立,则演员表有效:

  • e有类型TT胁迫U; 强制铸
  • e有类型*T,U*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有类型TTU任何数字类型; 数字播
  • e是一个类似C的枚举,U是一个整数类型; 枚举投
  • e有类型boolcharU是一个整数; 升麻INT-投
  • e有类型u8而且Uchar; U8-炭投
  • e有类型&[T; n]而且U*const T; 阵列-PTR铸
  • e是一个函数指针类型并U具有类型*T,而T: Sized; FPTR-PTR-投
  • e是函数指针类型,U是一个整数; FPTR-地址铸

其中&.T*T是可变性的引用,其中unsize_kind(T)是unsize信息的类型T- 特征定义的vtable(例如,fmt::DisplayIteratorIterator<Item=u8>)或长度(或()if T: Sized).

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

转换不是传递性的,也就是说,即使e as U1 as U2是有效的表达式,e as U2也不一定如此(事实上它只有在U1强制执行时才有效 U2).