免責事項: 私は C# から Scala にたどり着きました。C# では LINQ を高く評価していました。したがって、私はすぐにイテレータとシーケンスに慣れました。「C# スタイル」の利回りを逃しましたが、継続を使用して自分でクックすることができました...パフォーマンスが低下したとしても。
今では、C# でコレクションに対するメソッドが欠落している場合、それを拡張メソッドとして定義するだけで、コンパイラはコードを効率的に処理するという非常に優れた仕事をしてくれます。Scala では、Pimpのエンリッチ My Library アプローチを使用していますが、パフォーマンスが少し心配です。
ただし、私の「yield iterator」とは対照的に、これは認識された一般的なパターンです。Scala コンパイラーはそれを最適化し、一時オブジェクトの作成を削除しますか?
class RichFoo(f: Foo) {
def baz = f.bar()
def baz2 = f.bar() * 2
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
// on the caller side
val f : Foo = ....
f.baz
f.baz2
// this translates, literally, to new RichFoo(f).baz, new RichFoo(f).baz2
そうでない場合、なぜですか?私にとっては、適切で安全な最適化のように見えます。コンパイラを正しい方向に「ヒント」または「強制」できますか? より高速な代替手段はどれですか?
イテレータ/イテラブルを介してアルゴリズムのコレクションにパターンを使用したいので、それらをフィルター/マップ/などとして記述できますcollection.baz(lambda).bar(lambda2)
が、「重すぎる」ことが判明するのではないかと心配しています。(より効率的/直接的ですが、醜い と比較してbar(lambda2, baz(lambda, collection)
)