当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Into用法及代码示例


本文简要介绍rust语言中 Trait std::convert::Into 的用法。

用法

pub trait Into<T> {
    fn into(self) -> T;
}

消耗输入值的value-to-value 转换。与 From 相反。

应该避免实施 Into ,而是实施 From 。由于标准库中的一揽子实现,实现 From 会自动提供 Into 的实现。

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

注意:这个特质一定不能失败.如果转换可能失败,请使用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
    }
}

这将无法在旧版本的语言中编译,因为 Rust 的孤儿规则曾经更严格一些。为了绕过这个,你可以直接实现 Into

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

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

例子

String 实现 Into < Vec < u8 >>

为了表达我们希望泛型函数采用可以转换为指定类型 T 的所有参数,我们可以使用 Into <T> 的特征边界。例如:函数 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);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::convert::Into。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。