Devolver multiples valores
Podemos devolver más de un valor a la vez desde una función de dos maneras:
- Devolviendo un array si los valores son del mismo tipo
- Usando structs anónimos
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); |