不确定这是否可行,但您可以尝试一下。您可以将隐式分组到容器对象中。
示例:假设您有 type 和 的隐式X
,Y
并且Z
您并不总是希望implicit
为每个方法添加三个参数。假设您为这些定义了一个容器对象:
class MyImplicits(val x:X, val y:Y, val z:Z)
为了允许自动创建MyImplicits
包装器,您创建一个从各个隐式派生的对象方法。同样,您定义隐式展开方法:
object MyImplicits {
implicit def wrap(implicit x:X, y:Y, z:Z):MyImplicits = new MyImplicits(x, y, z)
implicit def unwrapX(implicit wrapper:MyImplicits):X = wrapper.x
implicit def unwrapY(implicit wrapper:MyImplicits):Y = wrapper.y
implicit def unwrapZ(implicit wrapper:MyImplicits):Z = wrapper.z
}
假设我们有一个这样的方法:
def foo(...)(implicit implicits:MyImplicits) = ...
以下应该有效:
implicit val implicitXIsInScope:X = ...
implicit val implicitXIsInScope:Y = ...
implicit val implicitXIsInScope:Z = ...
foo(...) // MyImplicits should automatically be created
同样,如果 的实例MyImplicits
在隐式范围内,您应该能够调用任何需要隐式实例的方法,X
而无需显式地打开它。
不过我没有尝试过。请让我知道它是否有效!