How to unpack a tuple into multiple variables?

Profunctor profunctor at example.com
Tue Feb 6 07:17:34 UTC 2024


On Monday, 5 February 2024 at 21:12:58 UTC, Gary Chike wrote:
> [ ... ]

In addition to the methods hitherto provided:

```d
auto getUser() => tuple("John Doe", 32);

// Name a Tuple's fields post hoc by copying the original's 
fields into a new Tuple.
template named(names...) {
     auto named(T)(ref auto T t) if (names.length <= 
T.Types.length) =>
         tuple!names(t.expand[0..names.length]);
}

{
     auto u = getUser().named!("name", "age");
     writeln(u.name, " (", u.age, ")"); // John Doe (32)

     // You could also do this. If only `with` were an expression!
     with (getUser().named!("name", "age"))
         writeln(name, " (", age, ")"); // John Doe (32)
}

// Define variables corresponding to a Tuple's fields in the 
current scope, whose
// identifiers are given by `names`.
mixin template Unpack(alias t, names...)
if (names.length <= t.Types.length) {
     static foreach (i, n; names)
         mixin("auto ", n, " = t[i];");
}

{
     auto u = getUser();
     mixin Unpack!(u, "name", "age");
     writeln(name, " (", age, ")"); // John Doe (32)
}
```

For either of these, one can "unpack" some or none of a Tuple's 
fields, and both can be modified to ignore any field to simulate 
`val (name, _, prof) = ("John Doe", 32, "Chemist")`.


More information about the Digitalmars-d-learn mailing list