7

オブジェクトにトレイトを実装Iterableし、実装されたメソッドに追加の暗黙的なパラメーターを渡す必要があります。

object MyRepository extends Iterable[Something] {

  def iterator(implict entityManager: EntityManager): Iterator[Something] = ...

}

iteratorメソッドには暗黙のパラメーターがなく、したがって上記のメソッドでは実装されていないため、明らかにこれは機能しません。

ユースケースの例はmap、リポジトリ値に適用したいメソッドです。

   def get = Action {
     Transaction { implicit EntityManager => 
       val result = MyRepository.map(s => s ...)
     }
   }

特性を実装しIterable、暗黙のプラマメーターをキャプチャする方法はありますか?

4

1 に答える 1

10

シグニチャにこれが暗黙的に含まれてIterable.iteratorいない場合、この暗黙を追加しているときにこのメソッドを実装できるとは期待できません。これは別のメソッド(具体的には、別のオーバーロード)になります。

ただし、MyRepositoryがオブジェクトではなくクラスである場合は、クラスコンストラクターで暗黙をキャプチャできます。MyRepository.map{ ... }また、(ではなく)同じ使用スタイルを維持したい場合new MyRepository.map{ ... }は、オブジェクトからクラスへの暗黙的な変換を提供することができます。

次に例を示します。

object MyRepository {  
  class MyRepositoryIterable(implicit entityManager: EntityManager) extends Iterable[Something] {
    def iterator: Iterator[Something] = ???
  }
  implicit def toIterable(rep: MyRepository.type)(implicit entityManager: EntityManager): MyRepositoryIterable = new MyRepositoryIterable
}

これを行うMyRepository.map(...)と、オブジェクトが暗黙的にインスタンスに変換され、そのインスタンスがMyRepositoryIterable暗黙の値をキャプチャしEntityManagerます。はMyRepositoryIterable実際に実装するクラスですIterable

于 2013-03-07T11:24:41.253 に答える