3
Здесь я хочу Lockstep итерацию по двум массивам size_tDMD не может вывести тип, даже если тип задается
import std.stdio;
import std.range;
import std.exception;
import std.conv;
struct zip(R,Q)
if(isInputRange!(R) && isInputRange!(Q))
{
R r;
Q q;
@property
const auto front() {
return tuple(r.front, q.front);
}
void popFront() {
r.popFront();
q.popFront();
}
@property
const bool empty() {
bool re = r.empty;
enforce(re == q.empty);
return re;
}
}
void main() {
size_t[] a = [0,1,2,3,4,5];
size_t[] b = [2,3,4,5,6,7];
foreach(size_t i, size_t j; zip!(size_t[],size_t[])(a,b)) {
writeln(to!string(i) ~ " " ~ to!string(j));
}
}
Но это не удается скомпилировать с
src/Interpreter.d(30): Error: cannot infer argument types
Однако, когда я изменить Еогеасп линия использовать UINT вместо size_t (я на 32-битном ноутбук)
foreach(uint i, uint j; zip!(size_t[],size_t[])(a,b)) {
Он собирает и работает нормально. Что происходит?
Я довольно новичок в D. Я слышал об этом раньше, и я думаю, что поставил вопрос о StackOverflow о настройке, но я отказался от него. Затем я, наконец, просто взял книгу на ней на прошлой неделе, и это первое, что я написал, которое использует шаблоны. Шаблоны D обычно еще не стабильны? Или мне просто не повезло? – dspyz
Это сработало. Думаю, мне придется использовать версию dev с этого момента. Благодаря! – dspyz
Я думаю, что вам удастся немного испортиться, в большинстве случаев, когда foreach (size_t a, something else; item), вы хотите, чтобы он был индексом в массиве. Чтобы вы хотели, чтобы size_t был членом кортежа, он, вероятно, путал компилятор. Была и некоторая недавняя работа над этой областью, потому что индексирование диапазонов в foreach использовалось, чтобы не работать без немного большего количества кода, и это совсем недавно стало фиксированным. –