2015-10-27 2 views
2

Традиционно это делается с 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); 

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

ответ

6

Это можно реализовать PHP's list construct как функцию в D:

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

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

+0

Это выглядит потрясающе, однако его можно переписать с помощью 'std.meta' вместо ваших собственных утилит? –

+1

Похоже, единственное, что вам нужно сделать, это заменить 'RangeTuple' на' std.typecons.staticIota'. – rcorre

+0

Спасибо, это должно быть в phobos. –

Смежные вопросы