let (x,y) = ...

Andrea Fontana via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Mon Nov 23 08:58:42 PST 2015


On Monday, 23 November 2015 at 11:12:33 UTC, visitor wrote:
> this work fine with your unittest :
> auto let(Ts...)(ref Ts vars) {
>     struct Let
>     {
>         void opAssign( Tuple!Ts xs ) {
>             foreach(i, t; Ts)
>                 vars[i] = xs[i];
>         }
>
>         static if (sameTypes!Ts) {
>             import std.conv : text;
>             void opAssign(Ts[0][] xs) { // redundant but more 
> effective
>                 enforce(xs.length == Ts.length, "let (...) = 
> ...: array must have " ~ Ts.length.text ~ " elements.");
>                 foreach(i, t; Ts)
>                     vars[i] = xs[i];
>             }
>
>             void opAssign(R)(R xs) if (isInputRange!R && 
> is(ElementType!R == Ts[0])) {
>                 static if (hasLength!R) {					
>                     enforce(xs.length >= Ts.length, "let (...) 
> = ...: range must have at least " ~ Ts.length.text ~ " 
> elements.");
>                 }
>                 foreach(i, t; Ts) {
>                     enforce(!xs.empty, "let (...) = ...: range 
> must have at least " ~ Ts.length.text ~ " elements.");
>                     vars[i] = xs.front;
>                     xs.popFront();
>                 }
>             }
>
>             void opIndexAssign(R)(R xs) if (isInputRange!R && 
> is(ElementType!R == Ts[0])) {
>                 foreach(i, t; Ts) {
>                     if(xs.empty) return;
>                     vars[i] = xs.front;
>                     xs.popFront();
>                 }
>             }
>         }
>     }
>     return Let();
> }

Nice. Why first enforce is "==" rather than ">=" ? This prevents 
something like:

auto arr = ["hello", "world", "!"];
string hello;
string world;

let (hello, world) = arr;




More information about the Digitalmars-d-announce mailing list