3

我有:

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参数,这将超出范围。如果您尝试创建本地functiondelegate. 我也考虑过用 来创建一个函数对象opCall,但是你不能用那些map(可以吗?)。

一些要求:

  • 返回的范围必须是惰性的(因此不要先将其复制到数组中)
  • 假设这getBar是获取数据的唯一方法。
  • 我希望地图被类封装(即不将地图移动到呼叫站点)。
4

1 回答 1

1

std.algorithm.map通过模板别名参数工作,并且绑定在编译时进行。Walter Bright(D 语言设计者)在这些情况下还不清楚模板别名参数的语义,尽管您尝试做的事情似乎在实践中以某种方式起作用。澄清这是一个待办事项(我认为)。也许您最好在 digitalmars.d 新闻组上问这个问题,因为这会引起 Walter 的注意并鼓励他澄清语义。

于 2010-10-03T01:33:05.130 回答