私はの複雑なキーを使用しています。そのキーは2つの部分で構成され、1つの部分はString
です。HashMap::get
メソッドを使用してルックアップを行う方法を見つけることができません。新しいルックアップごとにString
を割り当てません。HashMapに複雑なキーを使用するときに一時的な割り当てを避けるには?
#[derive(Debug, Eq, Hash, PartialEq)]
struct Complex {
n: i32,
s: String,
}
impl Complex {
fn new<S: Into<String>>(n: i32, s: S) -> Self {
Complex {
n: n,
s: s.into(),
}
}
}
fn main() {
let mut m = std::collections::HashMap::<Complex, i32>::new();
m.insert(Complex::new(42, "foo"), 123);
// OK, but allocates temporary String
assert_eq!(123, *m.get(&Complex::new(42, "foo")).unwrap());
}
問題は、最終的な主張である:
はここにいくつかのコードです。それは成功しますが、String
を構築せずにComplex
を構築することができないため、一時的なヒープ割り当てが必要です。
このような一時的な割り当てをなくすために、Rustは特性を提供します。これはHashMap::get
メソッドが使用します。
std::mem::transmute
を利用して、簡単なキー。たとえば、錆標準ライブラリの
PathBuf
実装
Borrow<Path>
ため
Borrow
仕事を作る方法を理解フード-が、私はそれが私の
Complex
タイプのために働くようにする方法を見つけ出すことはできません
#[derive(Debug)]
struct Borrowable {
// ??? -- What goes here? Perhaps something like:
n: i32,
s1: &str, // ??? -- But what would the lifetime be? Or maybe:
s2: str, // ??? -- But how would I extend this to a complex type
// containing two or more strings?
}
impl Borrowable {
fn new(n: i32, s: &str) -> &Self {
// ??? -- What goes here? It must not allocate.
unimplemented!();
}
}
impl std::borrow::Borrow<Borrowable> for Complex {
fn borrow(&self) -> &Borrowable {
// ??? -- What goes here? How can I transmute a Complex into a
// &Borrowable?
unimplemented!();
}
}
これは一般的な使用例のようですが、私はBorrow
について重要な何かを見逃していると思われますが、私は完全に迷っています。
[Cow](https://doc.rust-lang.org/std/borrow/enum.Cow.html)を調べましたか? – Aaronepower