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