Читаем Rust by Example полностью

_ => println!("Don't have Daniel's number."),

}

// `HashMap::insert()` returns `None`

// if the inserted value is new, `Some(value)` otherwise

contacts.insert("Daniel", "164-6743");

match contacts.get(&"Ashley") {

Some(&number) => println!("Calling Ashley: {}", call(number)),

_ => println!("Don't have Ashley's number."),

}

contacts.remove(&"Ashley");

// `HashMap::iter()` returns an iterator that yields

// (&'a key, &'a value) pairs in arbitrary order.

for (contact, &number) in contacts.iter() {

println!("Calling {}: {}", contact, call(number));

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

For more information on how hashing and hash maps (sometimes called hash tables) work, have a look at Hash Table Wikipedia

<p id="alternatecustom_key_types"><strong><a l:href="#alternatecustom_key_types">Alternate/custom key types</a></strong></p>

Any type that implements the Eq and Hash traits can be a key in HashMap. This includes:

   • bool (though not very useful since there is only two possible keys)

   • int, uint, and all variations thereof

   • String and &str (protip: you can have a HashMap keyed by String and call .get() with an &str)

Note that f32 and f64 do not implement Hash, likely because floating-point precision errors would make using them as hashmap keys horribly error-prone.

All collection classes implement Eq and Hash if their contained type also respectively implements Eq and Hash. For example, Vec will implement Hash if T implements Hash.

You can easily implement Eq and Hash for a custom type with just one line: #[derive(PartialEq, Eq, Hash)]

The compiler will do the rest. If you want more control over the details, you can implement Eq and/or Hash yourself. This guide will not cover the specifics of implementing Hash.

To play around with using a struct in HashMap, let's try making a very simple user logon system:

use std::collections::HashMap;

// Eq requires that you derive PartialEq on the type.

#[derive(PartialEq, Eq, Hash)]

struct Account<'a>{

username: &'a str,

password: &'a str,

}

struct AccountInfo<'a>{

name: &'a str,

email: &'a str,

}

type Accounts<'a> = HashMap, AccountInfo<'a>>;

fn try_logon<'a>(accounts: &Accounts<'a>,

username: &'a str, password: &'a str){

println!("Username: {}", username);

println!("Password: {}", password);

println!("Attempting logon...");

let logon = Account {

username,

password,

};

match accounts.get(&logon) {

Some(account_info) => {

println!("Successful logon!");

println!("Name: {}", account_info.name);

println!("Email: {}", account_info.email);

},

_ => println!("Login failed!"),

}

}

fn main(){

let mut accounts: Accounts = HashMap::new();

let account = Account {

username: "j.everyman",

password: "password123",

};

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители

Все жанры