Как назначить просто несколько возвращаемых значений?

Традиционно это делается с out параметры, например:

void notfun(ushort p, out ubyte r0, out ubyte r1)
{
    r0 = cast(ubyte)((p >> 8) & 0xFF);
    r1 = cast(ubyte)(p & 0xFF); 
}

С помощью кортежей это можно переписать как

auto fun(ushort p)
{
    import std.typecons;
    return tuple
    (
        cast(ubyte)((p >> 8) & 0xFF) ,
        cast(ubyte)(p & 0xFF)
    );
}

К сожалению, результат не может быть назначен непосредственно кортежу переменной:

void main(string[] args)
{
    ushort p = 0x0102;
    ubyte a,b;
    // ugly brute cast!
    *(cast(ReturnType!(typeof(fun))*) &a) = fun(0x0102) ;
}

Есть ли специальный синтаксис, чтобы позволить что-то вроде

(a,b) = fun(0x0102);

или любой другой идиоматический способ сделать что-то подобное?

1 ответ

Решение

Возможно реализовать PHP list построить как функцию в D:

https://github.com/CyberShadow/ae/blob/777bdecd8d81030275531bfb8a393c2bb88b3d36/utils/array.d#L434-L463

Это будет работать для кортежей и статических массивов.

Другие вопросы по тегам