ToOwnedトレイト

メモ

スライスから元のスマートポインタに変換することができることで使われているように思う。 Borrow<Borrowed>トレイトを実装することで自動導出もされる。

動機

Stringはメソッドを呼ぶと返り値として&strを返すものがあります。

trim_end

// 改行を取り除くと `&str` として戻される
let s = line.trim_end();

そこで素早く戻すために用意されているのが、ToOwned トレイト。

Trait alloc:borrow::ToOwned

借用されるデータに対して、何らかの Clone データを生成できることを表す。

Clone トレイトは &T から Tへの遷移を表すのに対して、 ToOwned トレイトは、借用データから所有データを生成するためのCloneを生成する。

pub trait ToOwned {
    // Owned: 自身を所有できる型を返す
    type Owned: Borrow<Self>;
    fn to_owned(&self) -> Self::Owned;
}

素早くStringに戻す

let s: &str = "hello world "; // 
// trim_end() -> &str 
let trimed_s = s.trim_end().to_owned();

スライスからVecの生成も素早く

let v: &[i32] = &[1, 2]; // &[i32; 2] (配列) はNG
let vv: Vec<i32> = v.to_owned();

参照

Rust における `From<T>` とか `Into<T>` とかの考え方 - Qiita へのコメント

ToOwnedはデータをラップするわけではなく、変換した新たな値を返すわけですから、「包む」という表現は不適切でしょう。 Cloneと同じく値を複製するわけですが、Cloneが同じ型に複製するのに対して、型の変換をしつつ複製するので、変換と複製で2回同じデータをコピーせずに済むというトレイトです