7

タイプのキーを持つ HashMap を~str慣用的に使用する方法を理解するのに苦労しています。例えば、

let mut map: hashmap::HashMap<~str, int> = hashmap::HashMap::new();
// Inserting is fine, I just have to copy the string.
map.insert("hello".to_str(), 1);

// If I look something up, do I really need to copy the string?
// This works:
map.contains_key(&"hello".to_str());

// This doesn't: as expected, I get
// error: mismatched types: expected `&~str` but found `&'static str` (expected &-ptr but found &'static str)
map.contains_key("hello");

このバグレポートに基づいて、試しました

map.contains_key_equiv("hello");

しかし得た

error: mismatched types: expected `&<V367>` but found `&'static str` (expected &-ptr but found &'static str)

この最後のメッセージはよくわかりません。誰か提案がありますか?

4

2 に答える 2

4

HashMap<K, V>with ~str(所有されている文字列) をK;として持っています。したがって、必要な場所、つまり、所有&Kされている文字列への参照です。ただし、静的文字列への参照を渡しています (シジル [ 、など]のない文字列リテラル、 、 タイプは です)。things&~str&~"hello"&'static str

文字列リテラルの場合、使用しないでください.to_str(); 代わりに、接頭辞~として , as ~"hello". そのような文字列リテラルの型は~strです。非リテラルの場合、通常.to_owned()&str.

最終的なコードは次のように動作します。

use std::hashmap::HashMap;

fn main() {
    let mut h = HashMap::new::<~str, int>();
    h.insert(~"foo", 42);
    printfln!("%?", h.find(&~"foo")); // => Some(&42)
    printfln!("%?", h.contains_key(&~"foo")); // => true

    // You don’t actually need the HashMap to own the keys (but
    // unless all keys are 'static, this will be likely to lead
    // to problems, so I don’t suggest you do it in reality)
    let mut h = HashMap::new::<&str, int>();
    h.insert("foo", 42);
    printfln!("%?", h.find(& &"foo")); // => Some(&42)
}

&&参照への参照が必要な場合は、ブール AND 演算子であるため実行できないことに注意してください。&(&x)またはする必要があります& &x

(また、3 か月前の問題は最新ではない可能性があることに注意してください。HashMap の比較手法の現在の状態については確信が持てません。正しい型を使用して、両方の方法を試してください。)

于 2013-07-29T03:57:37.143 に答える
3

の宣言contains_key_equivは次のとおりです。

pub fn contains_key_equiv<Q:Hash + Equiv<K>>(&self, key: &Q) -> bool

つまり、 に関連する何かへの参照が必要EquivですK == ~str。したがって、a &str(これはEquivalent~strです)をチェックするには、a (& &str文字列スライスへの参照) が必要です。

map.contains_key_equiv(&("hello"));

// or

map.contains_key_equiv(& &"hello");

(これらは同等であり、"foo" == &"foo"両方がであるという事実を回避するために必要であることに注意してください&str。)

于 2013-07-29T12:22:11.147 に答える