Sentinel Termination

Los arrays, slices y muchos punteros pueden ser terminados por un valor de su tipo hijo. Esto se conoce como terminación centinela. Siguen la sintaxis [N:t]T, [:t]T y [*:t]T, donde t es un valor del tipo hijo T.

Ejemplo de matriz con terminación centinela. El built-in @ptrCast se utiliza para realizar una conversión de tipo insegura. Esto nos muestra que el último elemento del array va seguido de un byte 0.

const expect = @import("std").testing.expect;

test "terminación de centinela" {
    const terminated = [3:0]u8{ 3, 2, 1 };
    try expect(terminated.len == 3);
    try expect(@as(*const [4]u8, @ptrCast(&terminated))[3] == 0);
}

Los tipos de literales de cadena son *const [N:0]u8, donde N es la longitud de la cadena. Esto permite que los literales de cadena coerzan a trozos terminados en centinela y a muchos punteros terminados en centinela. Nota: los literales de cadena están codificados en UTF-8.

test "string literal" {
    try expect(@TypeOf("hola") == *const [4:0]u8);
}

[:0]u8 y [:0]const u8 modelan perfectamente las cadenas de C.

const expect = @import("std").testing.expect;

test "C string" {
    const c_string: [*:0]const u8 = "hello";
    var array: [5]u8 = undefined;

    var i: usize = 0;
    while (c_string[i] != 0) : (i += 1) {
        array[i] = c_string[i];
    }
}

Los tipos terminados en sentinel se convierten a sus contrapartes no terminadas en sentinel.

const expect = @import("std").testing.expect;

test "coercion" {
    const a: [*:0]u8 = undefined;
    const b: [*]u8 = a;

    const c: [5:0]u8 = undefined;
    const d: [5]u8 = c;

    const e: [:0]f32 = undefined;
    const f: []f32 = e;

    _ = .{ b, d, f }; //uso ignorado
}

Se proporciona la segmentación terminada en sentinel que se puede utilizar para crear una segmentación terminada en sentinel con la sintaxis x[n..m:t], donde t es el valor del terminador. Hacer esto es una afirmación por parte del programador de que la memoria está terminada donde debería estarlo; hacerlo incorrectamente es un comportamiento ilegal detectable.

test "sentinel terminated slicing" {
    var x = [_:0]u8{255} ** 3;
    const y = x[0..3 :0];
    _ = y;
}
Edita esta pagina Última actualización: 5/15/2024 por Vital