Desestructuración

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.

Devolver multiples valores
Valores opcionales
© 2025 Zen of Zig