首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala:隐式传递一个隐式参数,显式传递另一个。有可能吗?

Scala:隐式传递一个隐式参数,显式传递另一个。有可能吗?
EN

Stack Overflow用户
提问于 2014-03-21 15:43:46
回答 5查看 16.2K关注 0票数 36

让我们考虑一下下面的函数:

def foo(implicit a:Int, b:String) = println(a,b)

现在,让我们假设作用域中有一个隐式的StringInt (implicit val i1=1),但是我们想显式地传递另一个而不是隐式Int (val i2=2)给foo

我们如何做到这一点?有可能吗?感谢您的阅读。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-21 16:08:43

我能补充的就是:

代码语言:javascript
复制
def foo(implicit a: Int, b: String) = println(a, b)
implicit val i1 = 1
implicit val s = ""
val i2 = 2
foo(i2, implicitly[String])
票数 36
EN

Stack Overflow用户

发布于 2014-03-21 22:33:41

如果您的方法有许多隐式参数(我有时在我的项目中有),而您有时只想显式指定其中一个,并让其他参数隐式解析,则可以像我的另一个答案中所示的那样,为每个其他参数编写implicitly。但有时您会更改该方法的签名,或者显式参数位于该参数列表的中间,那么您可以使用以下结构使客户端代码更具可读性:

假设你有一些类型和它们的隐式虚拟对象:

代码语言:javascript
复制
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

代码语言:javascript
复制
def foo1(implicit i1: I1, i2: I2, i3: I3, i4: I4, i5: I5, i6: I6) {
  println(i1, i2, i3, i4, i5, i6)
}

现在,您通常希望显式地指定i4: I4。所以你写道:

代码语言:javascript
复制
val i4 = new I4 {}
foo1(implicitly, implicitly, implicitly, i4, implicitly, implicitly)

丑陋!

使用以下代码(应该放在方法foo2的严格作用域中,并可能重命名)用于所有隐式的包装:

代码语言:javascript
复制
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

代码语言:javascript
复制
def foo2(implicit implicits: Implicits) = {
  import implicits._
  println(i1, i2, i3, i4, i5, i6)
}

您现在可以通过以下方式调用foo2而不是foo1

代码语言:javascript
复制
locally {
  foo2 // using implicit dummy objects I1, ..., I6 from above
  // or with explicit I4:
  val i4 = new I4 {}
  foo2(Implicits(i4))
}
票数 7
EN

Stack Overflow用户

发布于 2014-03-21 16:05:31

  1. 显式调用foo(i2, s1),但是您失去了使用implicit String
  2. Define def foo1(a: Int)(implicit b: String)=foo(a,b)的好处,于是您调用了foo1(i2)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22552985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档