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回同じデータをコピーせずに済むというトレイトです