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).
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top