1

假设我有一个A定义了一些隐式值的范围,以及一个c使用这些隐式值的代码块。我也有B具有兼容类型隐含的范围,因此如果我将代码块复制cB中,它将毫无问题地编译和运行。当然,这很难看,因为我c在两个地方复制,所以我想c进入它自己的功能。现在, 的函数签名c必须如下所示:

def c(args...)(implicit implicitArgs...) = ...

implicitArgs使用的隐含值在哪里c。鉴于某些框架(在我的例子中是 Scalding)定义了许多隐式,这里的签名很快就会失控。是否有任何语法说“在调用范围内携带所有隐式值”?或者有没有聪明的方法来解决这个问题?

干杯,杰夫

4

2 回答 2

0

不确定这是否可行,但您可以尝试一下。您可以将隐式分组到容器对象中。

示例:假设您有 type 和 的隐式XY并且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而无需显式地打开它。

不过我没有尝试过。请让我知道它是否有效!

于 2014-07-08T10:02:27.687 回答
0

I found a way to "curry implicit args":

def myfunc(arg:Something)(implicit session:Otherthing):Unit = ....

val curriedFunc = myfunc(value)(_:Otherthing)

curriedFunc(valueOfOtherThing)

For more information see Partials without Currying at http://www.codecommit.com/blog/scala/function-currying-in-scala

Note: I'm new to Scala and I don't know all best-practices.

于 2014-11-19T07:24:43.870 回答