gpt4 book ai didi

casting - From::from 和 Rust 中的 as 有什么区别?

转载 作者:行者123 更新时间:2023-11-29 07:56:13 25 4
gpt4 key购买 nike

我可以使用 fromas 在类型之间进行转换:

i64::from(42i32);
42i32 as i64;

它们之间有什么区别?

最佳答案

as只能用于一小部分固定的转换。 The reference documents as :

as can be used to explicitly perform coercions, aswell as the following additional casts. Here *T means either *const T or*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 item Function pointer Function item to function pointer cast
Function item *V where V: Sized Function item to pointer cast
Function item Integer Function item to address cast
Function pointer *V where V: Sized Function pointer to pointer cast
Function pointer Integer Function pointer to address cast
Closure ** Function pointer Closure to function pointer cast

* or T and V are compatible unsized types, e.g., both slices, both thesame trait object.

** only for closures that do not capture (close over) any local variables

因为 as编译器已知并且仅对某些转换有效,它可以执行某些类型的更复杂的转换。

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

因为它是一个特征,所以它可以在通用上下文中使用 ( fn foo(name: impl Into<String>) { /* ... */ } )。这对于 as 是不可能的(尽管从 num 箱子中看到 AsPrimitive )。

在数字类型之间进行转换时,需要注意的一件事是 From仅针对无损转换实现(例如,您可以使用 i32i64 转换为 From,但反之则不行),而 as适用于无损和有损转换(如果转换有损,则会截断)。因此,如果您想确保不会意外执行有损转换,您可能更喜欢使用 From::from。而不是 as .

另见:

关于casting - From::from 和 Rust 中的 as 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48795329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com