Разница между структурой и перечислением - PullRequest
0 голосов
/ 01 июля 2019

У меня есть некоторые недоразумения по поводу этого утверждения в официальной документации Rust.

https://doc.rust -lang.org / book / ch06-01-defining-an-enum.html

Существует еще одно преимущество использования перечисления, а не структуры: каждый вариант может иметь разные типы и объемы связанных данных.IP-адреса типа четыре версии всегда будут иметь четыре числовых компонента, которые будут иметь значения от 0 до 255. Если мы хотим сохранить адреса V4 как четыре значения u8, но по-прежнему выражать адреса V6 как одно строковое значение, мы не сможемсо структурой .Перечисления обрабатывают этот случай с легкостью:

#![allow(unused_variables)]
fn main() {
    enum IpAddr {
        V4(u8, u8, u8, u8),
        V6(String),
    }

    let home = IpAddr::V4(127, 0, 0, 1);

    let loopback = IpAddr::V6(String::from("::1"));
}

Но когда я попробовал это с структурами , чтобы сохранить адреса V4 как четыре значения u8, но по-прежнему выражать адреса V6 как одно строковое значение.также делает то же самое без ошибок.

#[derive(Debug)]
struct IpAddr {
    V4:(u8, u8, u8, u8),
    V6:String,
}

fn main (){
    let home = IpAddr{
        V4:(127,1,1,1), 
        V6: String::from("Hello"),
    };
    println!("{:#?}",home);      
}

1 Ответ

1 голос
/ 01 июля 2019

Это не то же самое.Все перечисляемые элементы имеют одинаковый размер!Размер элемента enum равен размеру наибольшего варианта плюс идентификатор варианта.

Со структурой это немного отличается.Если мы игнорируем заполнение, размер структуры является суммой размеров ее членов.С отступом это будет немного больше:

fn main() {
    let size = std::mem::size_of::<TheEnum>();
    println!("Enum: {}", size * 8);

    let size = std::mem::size_of::<TheStruct>();
    println!("Struct: {}", size * 8);
}

struct TheStruct {
    a: u64,
    b: u8,
    c: u64
}

enum TheEnum {
    A(u64),
    B(u8),
    C(u64)
}

Здесь мы видим разницу:

  • Enum: 128;64 для наибольшего варианта и 64 для идентификатора варианта.

  • Структура: 192;выровнен по 64 битам, поэтому у нас есть 54 бита заполнения

Другое отличие заключается в том, как вы используете перечисления и структуры.В перечислении вы должны инициализировать только один из вариантов.В вашем случае - либо IPv4, либо IPv6.Со структурой, как в вашем примере, вы должны предоставить адреса V4 и v6.Вы не можете предоставить только V4 или только V6.

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