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を作成しようとする場合も同様です。で関数オブジェクトを作成することも考えましたが、それらを使用することはできません(できますか?)。functiondelegateopCallmap

いくつかの要件:

  • 返される範囲は遅延でなければなりません (したがって、最初に配列にコピーしないでください)。
  • getBarそれがデータを取得する唯一の方法であると仮定します。
  • マップをクラスでカプセル化したい (つまり、マップを呼び出しサイトに移動しない)。
4

1 に答える 1

1

std.algorithm.mapテンプレートエイリアスパラメータを介して機能し、バインディングはコンパイル時に行われます。Walter Bright(D言語デザイナー)は、これらの状況でのテンプレートエイリアスパラメーターのセマンティクスについてはまだ明確にされていませんが、あなたがやろうとしていることは実際にはどういうわけかうまくいくようです。これを明確にするのはやることです(私は思います)。おそらく、digitalmars.dニュースグループでこれを尋ねたほうがよいでしょう。これは、ウォルターの注意を引き、セマンティクスを明確にするように促すからです。

于 2010-10-03T01:33:05.130 に答える