2010-10-03 9 views
3

у меня есть:Использование std.algorithm.map с функциями-членами в D2

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

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

+0

Не могли бы вы рассказать о том, что вы имеете в виду, «то, что вы пытаетесь сделать, как-то работает на практике». - Конечно, это не работает для меня. –

+0

@Peter: Я так же смущен, как вы о том, что работает, а что нет. Все, что я говорю, это то, что в некоторых случаях делегаты и т. Д. Работают на практике, хотя я понятия не имею, как это сделать. Это действительно нужно уточнить и должен быть отчет об ошибке. На данный момент просто нет хорошего ответа, кроме, возможно, в голове Уолтера. – dsimcha

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

  • Нет связанных вопросов^_^