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在其签名中没有 this 隐式,您不能期望在添加 this 隐式时能够实现此方法:那将是另一种方法(特别是另一个重载)。

但是,如果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 回答