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体内的隐式范围内有一个格式,但是我不知道这是你问题的必要条件,还是你想要缩小代码以适应问题的方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |