Devolver multiples valores

Devolver multiples valores

Podemos devolver más de un valor a la vez desde una función de dos maneras:

En el siguiente ejemplo, nos encargan construir un mecanismo que lleve el agua desde el río hasta el castillo - ¡ a 90 metros de altura! Como el mejor ingeniero medieval de la corte, ideamos una torre que, gracias a un ingenioso sistema de cazos oscilantes, es capaz de subir el agua a 4,5 metros de altura:

hydrotower.zig

const std = @import("std");

const print = std.debug.print;

// una torre con cazos oscilantes

const HydroTower = struct {

    // típico porcentaje del agua que se consigue

    // llevar por cada metro de subida

    const N_EFFICIENCY_PER_METER: f32 = 0.98;

    // altura de la torre

    n_height: f32,

    n_efficiency_per_meter: ?f32, // opcional

    // la torre sube el agua de la entrada

    // y devuelve cuánta llega y a qué altura

    fn lift_water(self: *const HydroTower, n_input: f32) [2]f32 {

        return .{

            n_input * std.math.pow(

                f32,

                // si no ponemos la eficiencia de la

                // torre específica se coge la típica

                self.n_efficiency_per_meter orelse

                    HydroTower.N_EFFICIENCY_PER_METER,

                self.n_height,

            ),

            self.n_height,

        };

    }

};

// caudal del río llevado hasta la torre

const WaterFlow = struct {

    n_liters_per_second: f32,

};

pub fn main() void {

    print("~\n", .{});

    // caudal 2L por segundo

    const o_river = WaterFlow{ .n_liters_per_second = 2 };

    // torre construida de 4.5m de altura

    const o_tower = HydroTower{

        .n_height = 4.5,

        // en la eficiencia no ponemos nada específico

        .n_efficiency_per_meter = null,

    };

    // desestructuramos el array devuelto

    const n_water, const n_height = o_tower

        .lift_water(o_river.n_liters_per_second);

    print("{}L → {}L a {}m  \n", .{ o_river.n_liters_per_second, n_water, n_height });

}

$ zig run hydrotower.zig

~

2L → 1.826196L a 4.5m

El método lift_water devuelve múltiples valores usando un array:

  [2]f32 { // <- devolverá un array de 2 posiciones float

 

  //...

  // desestructuramos el array devuelto

  const n_water, const n_height = o_tower

      .lift_water(o_river.n_liters_per_second);

Parámetros y argumentos
Desestructuración
© 2025 Zen of Zig