マイコンのプログラミングのために Rust を勉強しています。Rust 言語における Enum (列挙型) の特徴として、Enum の値にデータを格納してインスタンスのようなものを作成して扱えるのを知りました。

https://doc.rust-jp.rs/book-ja/ch06-01-defining-an-enum.html

上記サイトによれば

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

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

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

このようにして IpAddr という名前の Enum の値に、値によって型が異なる任意のデータを格納して扱えるとのことです。

私がこれまでに扱った言語では Enum は単なる定数の集合のようなもので、値は連番になるか定義時に定数を設定できるだけだったのですが、まるでクラスのような振る舞いをする Rust の Enum に少々混乱しています。

これは一体なぜこのような仕組みになっていて、どのように利用すれば便利さを感じられるのでしょうか。

できれば簡単なサンプルコード付きで解説いただけるとありがたいです。よろしくお願いします。