Usando std.algorithm.map com funções de membro em D2
Pergunta
Eu tenho:
Foo foo = new Foo();
foreach (i; 0..10)
{
Bar bar = foo.getBar(i);
...
}
Eu quero poder dizer (equivalente):
foreach (bar; foo.getAllBars())
{
...
}
Como faço para implementar getAllBars()
?
Imaginei algo assim:
class Foo
{
auto getAllBars()
{
return map!(getBar)(iota(10));
}
}
Mas você não pode fazer isso, é claro, porque getBar
depende do this
parâmetro, que sairá do escopo. O mesmo se aplica se você tentar criar um local function
ou delegate
. Eu também pensei em criar um objeto de função com opCall
, mas você não pode usar aqueles com map
(você pode?).
Alguns requisitos:
- O alcance devolvido deve ser preguiçoso (portanto, não copiá -lo em uma matriz primeiro)
- Assuma isso
getBar
é a única maneira de obter os dados. - Quero que o mapa seja encapsulado pela classe (ou seja, não movendo o mapa para o site de chamadas).
Solução
std.algorithm.map
Funciona através de um parâmetro de alias de modelo, e a ligação é no momento da compilação. Walter Bright (o designer de idioma D) ainda não ficou claro na semântica dos parâmetros de alias de modelo nessas situações, embora o que você esteja tentando fazer pareça fazer de alguma forma trabalhar na prática. Esclarecer isso é um TODO (eu acho). Talvez você seja melhor pedir isso ao DigitalMars.D NewsGroup, pois isso chamaria a atenção de Walter e o incentivaria a esclarecer a semântica.