我可以使用from
或as
:
i64::from(42i32);
42i32 as i64;
这些之间有什么区别?
答案 0 :(得分:8)
as
只能用于一组固定的小型转换。 The reference documents as
:
*T
可用于明确执行coercions以及。{ 以下额外演员阵容。此处*const T
表示*mut T
或| Type of e | U | Cast performed by e as U | | Integer or Float type | Integer or Float type | Numeric cast | | C-like enum | Integer type | Enum cast | | bool or char | Integer type | Primitive to integer cast | | u8 | char | u8 to char cast | | *T | *V where V: Sized † | Pointer to pointer cast | | *T where T: Sized | Numeric type | Pointer to address cast | | Integer type | *V where V: Sized | Address to pointer cast | | &[T; n] | *const T | Array to pointer cast | | Function pointer | *V where V: Sized | Function pointer to pointer cast | | Function pointer | Integer | Function pointer to address cast |
。T
†或
V
和as
是兼容的未归类类型,例如两个切片,都是相同的特征对象。
因为编译器知道fn foo<S: Into<String>(name: S) { /* ... */}
并且只对某些转换有效,所以它可以执行某些类型的更复杂的转换。
From
is a trait,这意味着任何程序员都可以为自己的类型实现它,因此可以在更多情况下应用它。它与Into
配对。自Rust 1.34以来TryFrom
和TryInto
一直保持稳定。
因为它是一个特征,所以它可以在通用上下文中使用(as
)。 From
无法做到这一点。
在数字类型之间进行转换时,需要注意的一点是i32
仅适用于无损转换(例如,您可以从i64
转换为From
使用as
,但不是相反),而From::from
适用于无损和有损转换(如果转换是有损的,则会截断)。因此,如果您想确保不会意外执行有损转换,则可能更倾向于使用as
而不是$
。
另见: