채팅 앱: Struct와 HashMap 비교

9387 단어 beginnersrust

сhat 앱을 예로 사용하여 Struct 및 HashMap 빠르게 살펴보기



우선 Aleksandr Petrosyan , Victor Gridnevsky 및 .

때로는 서로 다른 방법을 비교하는 것이 공부에 유용할 수 있습니다. 이 경우 StructuresHash Map 을 의미합니다. 구조는 데이터 유형입니다. 해시 맵은 컬렉션입니다. 둘 다 사용자 이름과 메시지를 전송하는 데 적합합니다.
구조체 및 해시 맵의 예:

use std::collections::HashMap;

struct Some_Struct { dictionary: HashMap<char, String> }

fn main() {
    // variable of type HashMap<char, String>
    let a: HashMap<char, String> = HashMap::new();
    // variable of type Some_Struct { dictionary: HashMap<char, String> }
    let b: Some_Struct = Some_Struct { dictionary: a };
}


다음은 StructuresHash Map 으로 만든 터미널 채팅 응용 프로그램의 예입니다. 여기서는 몇 가지만 보여드리겠습니다. 모든 코드는 저장소에 있습니다.

Cargo.toml 의존성:

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.67"
colored = "2.0.0"


송신기.rs
첫 번째 경우에는 데이터 유형"structure"을 생성하고 사용자 이름과 메시지를 저장하기 위한 "구조"유형의 변수를 생성해야 합니다.
두 번째 경우에는 Hash Map 유형의 변수를 만들고 일부 데이터도 삽입합니다. 키는 사용자 이름이고 값은 메시지입니다.

수신기.rs
동일하지만 새 구조의 필드로 id를 추가하고 새 구조에 이전 구조를 추가합니다structure.

chat_server/src/structures.rs

use std::iter::Map;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Debug)]
pub struct UserData {
    pub name: String,
    pub message: String,
}

#[derive(Debug)]
pub struct UserID {
    pub id: String,
    pub data: UserData,
}



chat_server/src/receiver.rs 구조

let deserialized: UserData = serde_json::from_str(&serde_message).expect("Could not read");


Hash Map에 사용자 ID addr을 추가할 필요가 없으며 다음과 같이 사용할 수 있습니다.

addr.to_string()


chat_server/src/receiver.rs 해시 맵

let deserialized: HashMap<String, String> = serde_json::from_str(&serde_message).expect("Could not read");


나는 Hash Map의 작업을 더 잘 알기 위한 유일한 목적으로 동일한 프로그램의 두 가지 버전을 만들었습니다. 이 글이 누군가에게 도움이 되었기를 바랍니다.

DATA_SIZE에 대해 조금



모든 데이터는 serde와 serde_json을 사용하여 u8의 벡터로 전송됩니다. 올바른 역직렬화를 위해서는 제한이 필요합니다. 나는 그것이 어떻게 작동하는지 아직 정확히 이해하지 못합니다. 일단 적용해 봅니다. 나중에 알아낼 것 같아요. 지금은 사용 방법의 예입니다.
chat_server 및 사용자

const DATA_SIZE: usize = 96;


chat_user/src/transmitter.rs

buff_serde.resize(DATA_SIZE, 0);


chat_server/src/receiver.rs

let mut buff_serde = vec![0; DATA_SIZE];


추가 상자



색상 상자 = 장식 도구로 사용되는 "2.0.0". 예를 들어:

.bold().yellow()
.italic().on_green()


유용한 방법



resize() len이 new_len과 같도록 Vec의 크기를 제자리에서 조정합니다.

into_iter()은 T를 반복합니다.

take_whale()은 클로저를 인수로 사용합니다. 반복자의 각 요소에서 이 클로저를 호출하고 true를 반환하는 동안 요소를 생성합니다.

read_exact() buf를 채우는 데 필요한 정확한 바이트 수를 읽습니다.

read_line() 줄 바꿈 구분 기호를 찾을 때까지 기본 스트림에서 바이트를 읽습니다.

좋은 웹페이지 즐겨찾기