Мой личный бложек. Пишу о жизни в Чехии, программировании и просто свои мысли обо всём. Пишу не часто.

 
foreach, opApply и return в D
Заметки не программиста
Lang:
struct Test
{
struct Item
{
bool x;
}
Item[] items;

@trusted int opApply(scope int delegate(ref Item[]) dg)
{
for (size_t i = 0; i < this.items.length; i++)
{
if (dg(this.items[i])) return 1;
}
return 0;
}
}

bool test(ref Test[] test)
{
foreach (ref item; test)
{
  if (item.x) return true; // !!! этот код не выходит из процедуры
}
return false;
}


В D есть замечательный оператор opApply перегрузив который можно реализовать foreach для структуры. И всё было бы просто супер, если бы не особенность реализации. Компилятор транслирует цикл foreach в вызов оператора opApply с делегатом, и "return" внутри foreach делает выход из делегата.
Компилятор при этом никак не ругается на такой return считая его валидным, что сильно затрудняет отладку программы.
0