From :: from和Rust之间有什么区别?

时间:2018-02-14 20:04:09

标签: casting rust

我可以使用fromas

在类型之间进行转换
i64::from(42i32);
42i32 as i64;

这些之间有什么区别?

1 个答案:

答案 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
     

†或Vas是兼容的未归类类型,例如两个切片,都是相同的特征对象。

因为编译器知道fn foo<S: Into<String>(name: S) { /* ... */}并且只对某些转换有效,所以它可以执行某些类型的更复杂的转换。

From is a trait,这意味着任何程序员都可以为自己的类型实现它,因此可以在更多情况下应用它。它与Into配对。自Rust 1.34以来TryFromTryInto一直保持稳定。

因为它是一个特征,所以它可以在通用上下文中使用(as)。 From无法做到这一点。

在数字类型之间进行转换时,需要注意的一点是i32仅适用于无损转换(例如,您可以从i64转换为From使用as,但不是相反),而From::from适用于无损和有损转换(如果转换是有损的,则会截断)。因此,如果您想确保不会意外执行有损转换,则可能更倾向于使用as而不是$

另见: