让我们考虑一下下面的函数:
def foo(implicit a:Int, b:String) = println(a,b)
。
现在,让我们假设作用域中有一个隐式的String
和Int
(implicit val i1=1
),但是我们想显式地传递另一个而不是隐式Int
(val i2=2
)给foo
。
我们如何做到这一点?有可能吗?感谢您的阅读。
发布于 2014-03-21 16:08:43
我能补充的就是:
def foo(implicit a: Int, b: String) = println(a, b)
implicit val i1 = 1
implicit val s = ""
val i2 = 2
foo(i2, implicitly[String])
发布于 2014-03-21 22:33:41
如果您的方法有许多隐式参数(我有时在我的项目中有),而您有时只想显式指定其中一个,并让其他参数隐式解析,则可以像我的另一个答案中所示的那样,为每个其他参数编写implicitly
。但有时您会更改该方法的签名,或者显式参数位于该参数列表的中间,那么您可以使用以下结构使客户端代码更具可读性:
假设你有一些类型和它们的隐式虚拟对象:
trait I1; implicit object I1 extends I1
trait I2; implicit object I2 extends I2
trait I3; implicit object I3 extends I3
trait I4; implicit object I4 extends I4
trait I5; implicit object I5 extends I5
trait I6; implicit object I6 extends I6
现在,您有了使用这些隐式的方法foo1
:
def foo1(implicit i1: I1, i2: I2, i3: I3, i4: I4, i5: I5, i6: I6) {
println(i1, i2, i3, i4, i5, i6)
}
现在,您通常希望显式地指定i4: I4
。所以你写道:
val i4 = new I4 {}
foo1(implicitly, implicitly, implicitly, i4, implicitly, implicitly)
丑陋!
使用以下代码(应该放在方法foo2
的严格作用域中,并可能重命名)用于所有隐式的包装:
object Implicits {
def apply(i4: I4)(implicit i1: I1, i2: I2, i3: I3, i5: I5, i6: I6) = new Implicits(i1, i2, i3, i4, i5, i6)
implicit def applying(implicit i1: I1, i2: I2, i3: I3, i4: I4, i5: I5, i6: I6) = new Implicits(i1, i2, i3, i4, i5, i6)
}
class Implicits(val i1: I1, val i2: I2, val i3: I3, val i4: I4, val i5: I5, val i6: I6)
和相关的方法foo2
def foo2(implicit implicits: Implicits) = {
import implicits._
println(i1, i2, i3, i4, i5, i6)
}
您现在可以通过以下方式调用foo2
而不是foo1
:
locally {
foo2 // using implicit dummy objects I1, ..., I6 from above
// or with explicit I4:
val i4 = new I4 {}
foo2(Implicits(i4))
}
发布于 2014-03-21 16:05:31
foo(i2, s1)
,但是您失去了使用implicit String
def foo1(a: Int)(implicit b: String)=foo(a,b)
的好处,于是您调用了foo1(i2)
https://stackoverflow.com/questions/22552985
复制相似问题