當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。