I'm having trouble figuring out how to use a HashMap with a key of type ~str
idiomatically. For example,
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");
Based on this bug report, I tried
map.contains_key_equiv("hello");
but got
error: mismatched types: expected `&<V367>` but found `&'static str` (expected &-ptr but found &'static str)
I really don't understand this last message; does anyone have a suggestion?
You have HashMap<K, V>
with ~str
(an owned string) as K
; thus, where it wants &K
for things
, that is &~str
—a reference to an owned string. You, however, are passing it a reference to a static string (a string literal without any sigil [&
, ~
, etc.], "hello"
, is of type &'static str
).
For string literals, do not use .to_str()
; instead, prefix it with a ~
, as ~"hello"
. A string literal like that is of type ~str
. For a non-literal, you should typically use .to_owned()
of a &str
.
The eventual code can operate like this:
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)
}
Observe that when you need a reference to a reference you can't do &&
as that is the boolean AND operator; you need to do &(&x)
or & &x
.
(Note also that any issue from three months ago may not be current; I'm not certain of the current state of HashMap's comparison techniques—try both ways, with the correct types.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With