У меня есть:
Foo foo = new Foo();
foreach (i; 0..10)
{
Bar bar = foo.getBar(i);
...
}
Я хочу вместо этого сказать (эквивалентно):
foreach (bar; foo.getAllBars())
{
...
}
Как мне реализовать getAllBars()
?
Я придумал что-то вроде этого:
class Foo
{
auto getAllBars()
{
return map!(getBar)(iota(10));
}
}
Но вы, конечно, не можете этого сделать, потому что getBar
зависит от параметра this
, который выйдет из области видимости.То же самое применимо, если вы пытаетесь создать локальный function
или delegate
.Я также рассмотрел создание объекта функции с opCall
, но вы не можете использовать объекты с map
(не так ли?).
Некоторые требования:
- Возвращаемый диапазондолжен быть ленивым (поэтому не копировать его сначала в массив)
- Предположим, что
getBar
- единственный способ получить данные. - Я хочу, чтобы карта была инкапсулирована классом(т.е. не перемещать карту на сайт вызова).