The Rust Book section on the as
operator目前说
The as keyword does basic casting:
let x: i32 = 5;
let y = x as i64;
It only allows certain kinds of casting, however.
那些某些类型允许的转换是什么?
此处已删除的答案解释说,有时您需要链接多个 as
-casts 才能获得安全的结果,这不能在一个步骤中完成。什么时候需要?
最佳答案
我认为这没有很好的记录,但是 here是一些您可能会觉得有用的信息:
A cast
e as U
is valid if one of the following holds:
e
has typeT
andT
coerces toU
; coercion-caste
has type*T
,U
is*U_0
, and eitherU_0: Sized
or unsize_kind(T
) = unsize_kind(U_0
); ptr-ptr-caste
has type*T
andU
is a numeric type, whileT: Sized
; ptr-addr-caste
is an integer andU
is*U_0
, whileU_0: Sized
; addr-ptr-caste
has typeT
andT
andU
are any numeric types; numeric-caste
is a C-like enum andU
is an integer type; enum-caste
has typebool
orchar
andU
is an integer; prim-int-caste
has typeu8
andU
ischar
; u8-char-caste
has type&[T; n]
andU
is*const T
; array-ptr-caste
is a function pointer type andU
has type*T
, whileT: Sized
; fptr-ptr-caste
is a function pointer type andU
is an integer; fptr-addr-castwhere
&.T
and*T
are references of either mutability, and where unsize_kind(T
) is the kind of the unsize info inT
- the vtable for a trait definition (e.g.fmt::Display
orIterator
, notIterator<Item=u8>
) or a length (or()
ifT: Sized
).Note that lengths are not adjusted when casting raw slices -
T: *const [u16] as *const [u8]
creates a slice that only includes half of the original memory.Casting is not transitive, that is, even if
e as U1 as U2
is a valid expression,e as U2
is not necessarily so (in fact it will only be valid ifU1
coerces toU2
).
关于casting - `as` 允许进行哪些转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884114/