Trait core::convert::Into

1.0.0 · source ·
pub trait Into<T>: Sized {
    // Required method
    fn into(self) -> T;
}
Expand description

消耗输入值的值到值转换。与 From 相反。

应该避免实现 Into,而应实现 From。 由于标准库中的全面实现,因此 From 的自动实现为 Into 的实现提供了一个实现。

在泛型函数上指定 trait bounds 时,最好使用 Into 而不是 From,以确保也可以使用仅实现 Into 的类型。

注意:此 trait 一定不能失败。如果转换可能失败,请使用 TryInto

泛型实现

  • From<T> for U 意味着 Into<U> for T
  • Into 是反射的,这意味着 Into<T> for T 被实现

在旧版本的 Rust 中实现 Into 转换为外部类型

在 Rust 1.41 之前,如果目标类型不是当前 crate 的一部分,那么您将无法直接实现 From。 例如,使用以下代码:

struct Wrapper<T>(Vec<T>);
impl<T> From<Wrapper<T>> for Vec<T> {
    fn from(w: Wrapper<T>) -> Vec<T> {
        w.0
    }
}
Run

由于 Rust 的孤儿规则过去要严格一些,因此无法在较旧的语言版本中进行编译。 要绕过它,您可以直接实现 Into

struct Wrapper<T>(Vec<T>);
impl<T> Into<Vec<T>> for Wrapper<T> {
    fn into(self) -> Vec<T> {
        self.0
    }
}
Run

重要的是要了解 Into 不提供 From 实现 (就像 FromInto 一样)。 因此,您应该始终尝试实现 From,如果无法实现 From,则应回退到 Into

Examples

String 实现 Into<Vec<u8>>

为了表示我们希望泛型函数采用所有可以转换为指定类型 T 的参数,我们可以使用 Into<T> 的 trait bound。

例如:函数 is_hello 接受所有可以转换为 Vec<u8> 的参数。

fn is_hello<T: Into<Vec<u8>>>(s: T) {
   let bytes = b"hello".to_vec();
   assert_eq!(bytes, s.into());
}

let s = "hello".to_string();
is_hello(s);
Run

Required Methods§

source

fn into(self) -> T

将此类型转换为 (通常是推断的) 输入类型。

Implementors§

source§

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