为什么BTreeMap<K,V>的元素可以通过与K不同类型的smth获得,而Vec和binary_search的情况并非如此?



我有一个问题要问。让我们看一下下面的代码:

use std::collection::BTreeMap;
fn main() {
let mut hm: BTreeMap<String, String> = BTreeMap::new();
hm.insert("asdf".to_owned(), "zxcv".to_owned());
println!("{:?}", hm.get("asdf"));
}

因此,尽管BTreeMap保留了Strings,但它接受了其他可以与密钥类型进行比较的类型。

但不只是Vec<T>的情况。因此下面的代码是错误的:

fn main() {
let v: Vec<String> = vec!["hello".to_owned()];
println!("{:?}", v.binary_search("hello"));
}

这个代码段将无法编译,因为binary_search调用对所提供值的完全相同类型的引用。我有点困惑为什么。

有人试图改变binary_search的签名以支持接受该值的借用版本,但它破坏了东西并被拒绝。

事实上,我有点惊讶这没有被考虑作为一个新的版本。我猜binary_search_by提供了一个解决方案(正如上面@Dogbert评论的那样),这使得补救这个问题的优先级很低。