为什么 BTreeMap<K, V> 的元素可以通过与 K 不同类型的东西得到,但 Vec 和 binary_search 却不能得到?

dro*_*te7 2 rust

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

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"));
}
Run Code Online (Sandbox Code Playgroud)

因此,尽管BTreeMapkeep Strings 它接受其他可以与键类型进行比较的类型。

但这不仅仅是 的情况Vec<T>。因此,下面的代码将是一个错误:

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

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

egg*_*yal 5

尝试更改 的签名binary_search以支持接受该值的借用版本,但它破坏了内容并被拒绝

实际上有点惊讶这没有被考虑用于新版本。我想事实上binary_search_by提供了一种解决方法(正如上面 @Dogbert 所评论的),因此解决这个问题的优先级较低。