Обратное ограничение generi c с чертой Заимствовать - PullRequest
1 голос
/ 02 февраля 2020

Я новичок в ржавчине, и я только что узнал о черте Borrow.
Из того, что я понимаю, черта Borrow предоставляет функцию borrow, которая работает так же, как заимствование (то есть &), но вы также можете использовать его в обобщенных c ограничениях (чего нельзя сделать с обычным синтаксисом заимствования).

У меня есть эта функция

pub fn get<Q>(&self, key: &Q) -> Option<&V>
    where K: Borrow<Q>,
          Q: Hash + Eq + ?Sized
{
    let bucket = self.bucket_key(key);
    self.buckets[bucket].iter().find(|&(ref ekey, _)| ekey.borrow() == key).map(|&(_, ref v)| v)
}

(я смотрел видео Джона Дженгсета на YouTube)

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

Поэтому мне было интересно, что именно это ограничение говорит о K и Q.
Означает ли это, что мы K заставляем себя вести себя как Borrow<Q> или K исправлено здесь (поскольку оно уже было определено в структуре), и мы ограничиваем Q (и за кулисами Rust преобразует его в нечто вроде Q: Unborrow<K> или что-то в этом роде).

Надеюсь, что в этом есть смысл. Я обычно делаю C#, где что-то подобное не имеет смысла.

1 Ответ

2 голосов
/ 02 февраля 2020

Полагаю, вы имеете в виду HashMap::get.

Не задумывайтесь над этим. Система признаков ржавчины - это, по сути, своего рода логика c, границы признаков подобны логическим ограничениям; здесь подпись типа говорит:

  • Q должно быть Hash, Eq и ?Sized
  • K должно быть заимствовано как Q

На практике это для удобства:

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(String::from("a"), 1u32);
    map.insert(String::from("b"), 2);

    assert_eq!(map.get("a"), Some(&1));
}

Переменная map здесь имеет тип HashMap<String, u32>. Если бы не Borrow, вам нужно будет написать:

map.get(&String::from("a"))

, но поскольку String можно заимствовать как str, а "a" имеет тип &'static str, Вы можете написать:

map.get("a")

Черта Borrow Документация имеет более подробное объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...