Почему "rust cook ie :: CookieJar" может получить значение через тип str - PullRequest
1 голос
/ 01 августа 2020

Я знаю, что базовая структура данных - это HashSet, но почему метод get может использовать тип &str вместо структуры cook ie?

car go .toml

[dependencies]
cookie = "0.14"

src / main.rs

use cookie::{Cookie, CookieJar};

fn main() {
    let mut jar = CookieJar::new();

    jar.add(Cookie::new("a", "one"));
    jar.add(Cookie::new("b", "two"));

    assert_eq!(jar.get("a").map(|c| c.value()), Some("one"));
    assert_eq!(jar.get("b").map(|c| c.value()), Some("two"));

    jar.remove(Cookie::named("b"));

    assert!(jar.get("b").is_none());
}

1 Ответ

3 голосов
/ 01 августа 2020

Авторы cookie-rs реализовали трейт Hash и Borrow для значений HashSet.

Вот пример, имитирующий такое же поведение:

use std::borrow::Borrow;
use std::hash::{Hash, Hasher};
use std::collections::HashSet;

#[derive(Debug, Eq)]
struct Cookie<'a> {
  name: &'a str,
  id: u64,
}

impl Hash for Cookie<'_> {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.name.hash(state);
    }
}

impl PartialEq for Cookie<'_> {
    fn eq(&self, other: &Cookie) -> bool {
        self.name == other.name
    }
}

impl Borrow<str> for Cookie<'_> {
    fn borrow(&self) -> &str {
        self.name
    }
}

fn main() {
    let mut cookies: HashSet<Cookie> = HashSet::new();
    
    cookies.insert(Cookie {
        name: "example",
        id: 42,
    });
    
    println!("{:?}", cookies.get("example"));
}

Это даст нам:

Some(Cookie { name: "example", id: 42 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...