開発

[rust] 型エイリアスを理解する

Rustのtypeという文が新しい型を作るものだと勘違いしていたのですが、少し気になったのでtypeを使ったコードを試してみました。

typeは型エイリアスで型の別名を作るものです。ただそれだけで元の型と同じに使えます。

型エイリアスは別名なので本質は同じ型と認識されるので、型エイリアスとオリジナルの型が一致していれば束縛可能です。

ただし、サフィックスには型エイリアスは使えないようです。

New Type Patternでtypeを使わないのは何故か?と思っていたのですがエイリアスなので別物として扱わないからなのですね。

struct AAA {}

struct BBB {}

struct DDD<T>(T);

type XX = i64;
fn f1(x: XX) -> XX {
    x
}

type YY = XX;
type yy = XX;
fn f2(y: YY) -> XX {
    y
}

fn f4<T>(z: T) -> T {
    z as T
}

fn main() {
    type ZZ = i64;

    let a: ZZ = 1;
    let b: i64 = a;
    let c: YY = b as ZZ;
    let e: XX = c as ZZ;
    // let d: i64 = 2_yy; // ERROR
    // let d: i64 = 3_YY; // ERROR
    f1(4 as YY);
    f2(5 as ZZ);
    let f3 = |x: XX| -> ZZ { x as YY };
    f4::<XX>(e);
    f4::<yy>(e);
    f4::<YY>(e);
    f4::<ZZ>(e);

    type CCC = AAA;
    let aaa: AAA = AAA {};
    let bbb: BBB = BBB {};
    let ccc: CCC = AAA {};
    let ccc: CCC = aaa;
    let ddd: DDD<BBB> = DDD(bbb);
    let ddd: DDD<XX> = DDD(11);
    let eee: DDD<YY> = DDD(22);
    let fff: DDD<ZZ> = DDD(33);
    let ggg: DDD<ZZ> = ddd;
    let hhh: DDD<XX> = eee;
    let iii: DDD<YY> = fff;
    // let eee: BBB = ccc; // ERROR
}
Code language: HTML, XML (xml)

Playground

管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago