Использование std.algorithm.map с функциями-членами в D2 - PullRequest
3 голосов
/ 03 октября 2010

У меня есть:

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 - единственный способ получить данные.
  • Я хочу, чтобы карта была инкапсулирована классом(т.е. не перемещать карту на сайт вызова).

1 Ответ

1 голос
/ 03 октября 2010

std.algorithm.map работает через параметр псевдонима шаблона, а привязка выполняется во время компиляции.Уолтер Брайт (дизайнер языка D) еще не совсем понял семантику параметров псевдонима шаблона в этих ситуациях, хотя то, что вы пытаетесь сделать, похоже, как-то работает на практике.Пояснение - это задача (я думаю).Возможно, вам лучше спросить об этом в группе новостей digitalmars.d, так как это привлечет внимание Уолтера и побудит его уточнить семантику.

...