gpt4 book ai didi

rust - 我应该什么时候实现 std::convert::From vs std::convert::Into?

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

我看到了 std::convert::Into有任何实现 std::convert::From 的实现:

impl<T, U> Into<U> for T
where
U: From<T>,

在Rust 1.0标准库中,From的实现有很多,而Into只有3处实现。这使得实现 From 似乎应该是默认的。我确信有时我想要实现 Into 而不是 From,但我没有看到它们。

最佳答案

TL;DR:更喜欢实现 From .


有趣的是,the original RFC关于 std::convert traits 建议相反的一揽子实现:

impl<T, U> From<T> for U
where
T: Into<U>

但是在执行它的 PR 上,it was changed to the opposite :

Added From => Into implementation, which makes it possible to add conversions in both directions without running afoul of coherence. For example, we now have From<[T]> for Vec<T> where T: Clone, which yields the corresponding Into going in the other direction -- despite the fact that the two types live in different crates.

I also believe this addresses a few concerns about things implementing From instead of Into

这个最后一刻的变化反射(reflect)了 FromInto基本上是等价的。 From之所以被选为首选,是因为从“类型参数与本地类型”的角度来看,它的限制较少。

之前Rust 1.41.0 , 不可能制作 impl<'a, T> Into<Foo> for &'a [T] , 而 impl<'a, T> From<&'a [T]> for Foo是可能的。

第一次尝试引发了 E0210 :

error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> x.rs:3:10
|
3 | impl<'a, T> Into<Foo> for &'a [T] {
| ^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter

在 Rust 1.14 之前的标准库中,只有两个实现 Into 的例子而不是 From :

  • impl Into<Vec<u8>> for String
  • impl Into<OsString> for PathBuf

我认为这些是他们接口(interface)逻辑的反射(reflect)。 OsString工具 From<String>From<T> where T: AsRef<OsStr> ,因为它们是您想要构建 OsString 的自然事物来自。

然而,PathBuf仍然实现 Into<OsString>作为其From<OsString>的反向操作实现,但是这个逻辑属于PathBuf , 不是 OsString .

关于rust - 我应该什么时候实现 std::convert::From vs std::convert::Into?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812530/

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