Почему граница предложения присутствует в предложении where, а не в сигнатуре функции? - PullRequest
0 голосов
/ 22 декабря 2018

Я читаю HashMap get функция , но я не могу найти параметр типа K в исходном коде.

Почему K граница признака существует в предложении where, но не в сигнатуре функции?

pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
    where K: Borrow<Q>,
          Q: Hash + Eq
{
    self.search(k).map(|bucket| bucket.into_refs().1)
}

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я думаю, что метод search в теле get метода использует K: Borrow<Q> границы признака, поэтому для метода get нужны те же границы признака.
И об использовании &str или &String для ключевых значенийв параметрах метода get
достаточно использовать только &Q type

0 голосов
/ 22 декабря 2018

K - это параметр типа HashMap<K, V, S>, и он вводится в начале соответствующего impl блока :

impl<K, V, S> HashMap<K, V, S>
    where K: Eq + Hash,
          S: BuildHasher

Он применим для всего блока, включая get, который добавляет дополнительное ограничение, K: Borrow<Q>.

Этот способ указания типа get k может быть немного неудобным, ноэто позволяет нам, например, сделать следующее:

let mut map: HashMap<String, usize> = HashMap::new();

map.insert("herp".to_string(), 1);
map.insert("derp".to_string(), 2);

assert_eq!(map.get("herp"), Some(&1)); // we can search by &'static str (not only by a String)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...