Zen言語の標準ライブラリ紹介〜generic〜

はじめに

けっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。 まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。

リクエストあれば、優先する、かも?

どんな型でも比較できる便利な奴ら、genericを紹介します。

std.generic.equal

2つの引数、a, b が一致しているかどうかをブール値で返します。 この関数は任意の型に対して使用できますが、abとは同じ型でなければなりません。

型パラメータが不要なので、とっても便利です。

///Compares two of any type for equality. Containers are compared on a field-by-field basis,
/// where possible. Pointers are not followed.
pub fn equal(a: var, b: @TypeOf(a)) bool

利用例です。 整数型だろうが、配列だろうが、構造体だろうが、型だろうが、雑に突っ込めば善きに計らってくれます。

test "generic equal" {
    // integer
    testing.ok(generic.equal(10, 10));
    // floating point
    testing.ok(generic.equal(5.7, 5.7));
    // slice []const u8
    testing.ok(generic.equal("hello"[0..], "hello"[0..]));
    // type
    testing.ok(generic.equal(usize, usize));

    var a: usize = 10;
    // pointer
    testing.ok(generic.equal(&a, &a));

    const S = struct {
        a: u32 = 10,
        b: f64 = 5.7,
        c: []const u8 = "hello"[0..],
    };
    // struct
    testing.ok(generic.equal(S{}, S{}));

    const RefS = struct {
        ptr: *S,
    };
    // `s1` と `s2` は同じ値を持つ
    var s1 = S{};
    var s2 = S{};
    const ref_s1 = RefS{ .ptr = &s1 };
    const ref_s2 = RefS{ .ptr = &s2 };
    // Pointer is not followed.
    testing.ok(!generic.equal(ref_s1, ref_s2));
}

ただし、最後に示しているように、ポインタの指し先の値が一致しているかどうか、までは見てくれません。

std.generic.lessThan

a < bであるかどうかをブール値で返します。 equalと大体同じです。

///Compares two of any type for a lessThan order. Containers are compared on a field-by-field basis,
/// where possible. Pointers are not followed.
pub fn lessThan(a: var, b: @TypeOf(a)) bool