2

シミュレーションの状態の特性を定義するこのスニペットについて考えてみます。これは、ユーザーが派生型で実装することが期待されています。特性上、ユーティリティメソッドのコレクションは、Scalaライブラリコレクションがこれを行うのと同様に、実装のタイプを持つ結果を提供できる必要があります。これを実現するには、次のように、実装タイプを使用してトレイトをパラメーター化する必要があると思います。

trait State[+This <: State[This]] {
   def update : This  // result has type of State's implementor
}

ここで、次のようなマルチステップの更新メソッドを定義したいと思います。

def update(steps: Int) : This 

私が素朴なアプローチを試みるとき:

def update(steps: Int) : This = 
    (this /: (0 until steps))( (s,n) => s.update )

コンパイラは型の不一致について文句を言います:

 error: type mismatch;
 found: State[This]
 required: This

thisこれは、State内で見られるように、State[This]タイプを持っているので意味があります。コードをコンパイルするには、明示的なキャストを行う必要があるようです。

def update(steps: Int) : This = 
    (this.asInstanceOf[This] /: (0 until steps))( (s,n) => s.update )

この明示的なキャストを回避する方法、またはより一般的にはより良い方法で意図した結果を達成する方法はありますか?ありがとう。

4

1 に答える 1

5

Stateであることを確認するには、自己型注釈を追加する必要がありますThis

trait State[+This <: State[This]] { this: This =>
  def update: This  // result has type of State's implementor
}

update(Int)折り畳みなしでメソッドを再定義する可能な方法は次のとおりです。

def update(steps: Int): This = Iterator.iterate(this)(_.update).drop(steps).next
于 2011-12-05T10:26:43.697 に答える