gpt4 book ai didi

scala - 使用附加隐式参数实现特征方法

转载 作者:行者123 更新时间:2023-12-04 14:14:57 27 4
gpt4 key购买 nike

我想要一个对象来实现特征 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 trait 并捕获隐式参数?

最佳答案

鉴于 Iterable.iterator在其签名中没有隐含 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值(value)。 MyRepositoryIterable是实际实现 Iterable 的类.

关于scala - 使用附加隐式参数实现特征方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com