【问题标题】:Scala capture all implicits of the calling scope?Scala 捕获调用范围的所有隐式?
【发布时间】:2014-08-28 16:44:13
【问题描述】:

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

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

其中implicitArgsc 中使用的隐式值。鉴于某些框架(在我的例子中是 Scalding)定义了许多隐式,这里的签名很快就会失控。是否有任何语法说“在调用范围内携带所有隐式值”?或者有什么聪明的办法吗?

干杯, 杰夫

【问题讨论】:

    标签: scala implicit implicit-parameters


    【解决方案1】:

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

    示例:假设您有 XYZ 类型的隐式,并且您并不总是想为每个方法添加三个 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 隐式实例的方法,而无需显式解包。

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

    【讨论】:

    • 是的,这样的事情会起作用,尽管它仍然是一个相当大的障碍。我想我想要一种用于动态范围隐式值的机制或语法。
    【解决方案2】:

    我找到了一种“咖喱隐式参数”的方法:

    def myfunc(arg:Something)(implicit session:Otherthing):Unit = ....
    
    val curriedFunc = myfunc(value)(_:Otherthing)
    
    curriedFunc(valueOfOtherThing)
    

    如需更多信息,请参阅http://www.codecommit.com/blog/scala/function-currying-in-scalahttp://www.codecommit.com/blog/scala/function-currying-in-scalaPartials without Currying

    注意:我是 Scala 新手,并不了解所有最佳实践。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 1970-01-01
      • 2019-01-10
      • 2014-01-30
      • 1970-01-01
      • 2017-06-26
      • 2019-03-07
      • 2015-11-21
      • 2014-02-05
      相关资源
      最近更新 更多