Borrow<Borrowed: ?Sized>トレイトとToOwnedトレイト
String
の借用は、&str
として、&str
の所有は、String
として表すことが出来る。
Rustでは、こういった関係をBorrow<Borrowed: ?Sized>とToOwnedトレイトを使って表すことが出来る。
Note: 参照 - ある所有された値への借用を表す型。コピーセマンティックである。
trait Borrow<Borrowed: ?Sized>
別の型への参照を生成する。
T
→ &Borrowed
※ BorrowedをBorrowする型とよめる
pub trait Borrow<Borrowed> where Borrowed: ?Sized, { fn borrow(&self) -> &Borrowed; }
String = Borrow<str>
impl Borrow<str> for String { fn borrow(&self) -> &str { &sef[...] } }
Vec<T> = Borrow<[T]>
Box<T> = Borrow<T>
Borrowの役割
HashMapにおいて、get
メソッドは以下のように定義されている。
impl <K, V, S> HashMap<K, V, S> where K: Eq + Hash, S: BuildHasher, pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, Q: Hash + Eq,
K
:Borrow<Hash + Eq>
型
これによってキーの型がStringでもBorrow<str>
型に型が弱めることができている。
use std::collections::HashMap; let mut contacts = HashMap::new(); contacts.insert(String::from("Tanaka"), String::from("062-2222-3333")); contacts.insert(String::from("Yoshida"), String::from("055-1234-5467")); // &strで値を取り出せる dbg!(contacts.get("Yoshida"))
trait ToOwned
pub trait ToOwned { type Owned = Borrow<Self>; fn to_owned(&self) -> Self::Owned; }
Clone
トレイトが&T
からT
への変換に対して、ToOwned
トレイトは、Tから特定の型(Borrow<T>
)への変換。
実装している型
str
[T]
Path
str
impl ToOwned for str { type Owned = String; // Borrow<Self> である必要がある fn to_owned(&self) -> String }
[T]
impl ToOwned for [T] where T: Clone, { type Owned = Vec<T>; fn to_owned(&self) -> Vec<T> }
Path
impl ToOwned for Path { type Owned = PathBuf; fn to_owned(&self) -> PathBuf }