【问题标题】:How to pass a function with implicit as parameter如何以隐式作为参数传递函数
【发布时间】:2015-04-24 11:01:34
【问题描述】:

我想将函数fun1 作为参数传递给fun2。 但是fun1 需要一个隐式参数。是否可以在 fun2 中定义该隐式值?

代码是这样的:

import org.json4s._
import org.json4s.jackson.JsonMethods._

  def fun1(json:JValue)(implicit formats: Formats) = {

        //do something
  }


  def fun2(f: (JValue) => RatEvent,line:String ) = {

        implicit val formats = DefaultFormats  //has been defined in import
        val json = parse(line)  //covert string to jvalue
        val result = f(json)
  }

在这里我将fun1 传递给fun2,编译器抱怨它找不到fun1 的隐含值。

  fun2(fun1,"asdfasdf")    //error here,   fun1 is lack of an implicit value

我想通过改变fun2的形状来解决问题,即

def fun2(f: (JValue)(implicit Formats) => RatEvent,line:String ) //doesn't compile

但是我不知道怎么写正确。

补充:

声明一个隐式格式似乎是一个不错的解决方案。但我必须在 fun2 中定义它。我把问题简单化了。真正的乐趣是这样的:

  def fun2(f: (JValue) => RatEvent,lines:RDD[String] )(implicit sc:SparkContext) = {

        for (
          line <- lines
        ){
        implicit val formats = DefaultFormats  //has been defined in import
        val json = parse(line)  //covert string to jvalue
        val result = f(json)
        ......
        }
  }

formats 必须在linesmap 函数内定义(我使用for 代替)。

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    Scala 函数值的apply 方法只有一个参数列表,不带任何隐式参数。你对此无能为力。

    您可以更改fun2 的形状以将额外参数作为普通参数:

    class J; class F; class R
    
    def fun1(j: J)(implicit f: F): R =
      new R
    def fun2(fn: (J, F) => R) {
      fn(new J, new F)
    }
    
    fun2(fun1(_)(_))
    

    但是很糟糕;呼叫站点不如您想要的fun2(fun1)

    如果您在调用站点的范围内有一个隐式 F,那么您可以更改 fun2 的形状,如下所示:

    class J; class F; class R
    
    def fun1(j: J)(implicit f: F): R =
      new R
    
    def fun2(fn: J => R)(implicit f: F) {
      fn(new J)
    }
    
    implicit val f = new F
    fun2(fun1)
    

    是的,干净的呼叫站点!

    这是否符合您的要求?在您的问题中,您在fun2 的主体内只有一个隐式范围内的Formats,但我不知道这是否是您问题的必要条件,或者只是您压缩代码以适应的方式的意外情况在一个问题中。

    【讨论】:

    • 您好,感谢您的回答。我必须在fun2 中定义Formats。我已经更新了问题。
    • 在这种情况下,我看不出如何改进 fun2(fun1(_)(_)) 解决方案。
    猜你喜欢
    • 2011-07-27
    • 2018-07-06
    • 2021-12-11
    • 2021-06-26
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多