2011-12-05 5 views
2

シミュレーションの状態の特性を定義するこのスニペットを検討してください。このスニペットは、ユーザーがいくつかの派生型で実装することが期待されています。この特性上、ユーティリティメソッドのコレクションは、Scalaライブラリコレクションがこれを行うのと同様に、実装の型を持つ結果を提供できるはずです。それを達成するために、私はこのように、私は実装タイプと特性をパラメータ化する必要があると思う:Scala:foldLeftの型パラメータへのキャストを避ける

def update(steps: Int) : This 

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

今、私はこのような多段階の更新方法を定義したいと思います

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

コンパイラは型の不一致文句を言う:私は単純なアプローチをしようとすると

thisは状態内に見られるので、意味があります。状態は[This]です。この明示的なキャスト、またはより一般的には良い方法で意図した結果を達成するために回避する方法はあります

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

: は、コードをコンパイルするために取得するには、私が明示的なキャストをしなければならないようですか?ありがとう。

あなたが StateThisであることを保証するために、自己型注釈を追加する必要が

答えて

5

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 
+0

ナイス!ありがとうございました! –

関連する問題