Desestructuración
Un punto interesante del ejemplo es la desestructuración del resultado. Esta desestructuración se puede hacer sin la necesidad de que provenga de una función, siempre que se lleve a cabo sobre: tuplas, arrays y vectores. Los vectores son un tipo que veremos más adelante.
Podríamos usar una tupla (un struct anónimo es una tupla) en vez del array para devolver múltiples datos - es muy útil cuando esos datos son de distintos tipos:
|
// devolverá una tupla fn lift_water(self: *const HydroTower, n_input: f32) struct { f32, u8 } { //... // desestructuramos la tupla devuelta const f_water, const n_height = o_tower .lift_water(o_river.n_liters_per_second); // o recuperamos la tupla para desestructurarla o usarla después const t_resp = o_tower.lift_water(o_river.n_liters_per_second); // desestructurar const f_water, const n_height = t_resp; // usar directamente los valores por índice t_resp[0], t_resp[1] |
También podemos usar un struct anónimo con campos nombrados, pero no lo podremos desestructurar:
|
// devolverá un struct anónimo con campos nombrados fn lift_water(self: *const HydroTower, n_input: f32) struct { f_water: f32, n_height: u8 } { //... // no podemos desestructurar el struct con campos nombrados const o_output = o_tower .lift_water(o_river.n_liters_per_second); // en este caso accedemos los valores por nombre print("{}L a {}m \n", .{ o_output.f_water, o_output.n_height }); |
Porque aunque toda tupla sea un struct anónimo, no todos los struct anónimos son tuplas. Si usamos los campos nombrados ya no es una tupla.