【发布时间】: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 必须在lines 的map 函数内定义(我使用for 代替)。
【问题讨论】: