構造体や列挙体の列挙子がタプル形式の場合、それらの名前はデータ初期化用の関数のように動作する。この関数は通常の関数と同じように扱える。つまり、そのまま呼び出す事も、参照として持ちだしてから呼び出す事もできる。

構造体の場合


fn main() {
    let x_f = MyStructX;
    let y_f = MyStructY;
    let z_f = MyStructZ;
    assert!(x_f() == MyStructX());
    assert!(y_f(1) == MyStructY(1));
    assert!(z_f(1, 2) == MyStructZ(1, 2));
}

#[derive(Eq, PartialEq)]
struct MyStructX();

#[derive(Eq, PartialEq)]
struct MyStructY(i32);

#[derive(Eq, PartialEq)]
struct MyStructZ(i32, i32);

列挙体の場合


fn main() {
    let a_f = MyEnum::A;
    let b_f = MyEnum::B;
    let c_f = MyEnum::C;
    assert!(a_f() == MyEnum::A());
    assert!(b_f(1) == MyEnum::B(1));
    assert!(c_f(1, 2) == MyEnum::C(1, 2));
}

#[derive(Eq, PartialEq)]
enum MyEnum {
    A(),
    B(i32),
    C(i32, i32)
}

補足

タプル形式における空のタプルと異なり、まったく中身の指定されない識別子では、関数としての利用はできない。