加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何使用隐式参数传递函数

发布时间:2020-12-16 18:31:10 所属栏目:安全 来源:网络整理
导读:我想将函数fun1作为参数传递给fun2. 但是fun1需要一个隐含参数.有可能在fun2中定义隐含值吗? 代码是这样的: import org.json4s._import org.json4s.jackson.JsonMethods._ def fun1(json:JValue)(implicit formats: Formats) = { //do something } def fun
我想将函数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)
        ......
        }
  }

格式必须在行的map函数中定义(我用来代替).

解决方法

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体内的隐式范围内有一个格式,但是我不知道这是你问题的必要条件,还是你想要缩小代码以适应问题的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读