问题描述:
今天需要写一段Spark中的需求代码,在抽取特质的时候,需要把一段代码传到def 函数中,于是用到了scala中的控制抽象,在使用传参中用到了op : ()=> Unit,出现了不执行的情况
具体代码:
trait中部分代码:
def start(master:String="local[*]")(name:String="application")(op : ()=>Unit): Unit ={
val sparkConf=new SparkConf().setMaster(master).setAppName(name)
val sc=new SparkContext(sparkConf)
EnvUtil.set(sc)
try {
op
} catch {
case ex => println(ex.getMessage)
}
sc.stop()
}
application中部分代码:
start("local[*]")("application"){
val wordCountController=new WordCountController()
wordCountController.dispatch()
}
于是出现了编译无法通过的情况
查问题,资料,终于发现了问题,还是自己的scala基础不牢固
在scala中:
op : => Unit 和 op : () => Unit 是有很大的区别的
op : => Unit 是指一段代码,这段代码的执行结果是Unit
op : () => Unit 是指一个无传入参数,返回值为Unit的函数
在调用时:前者 op 就会直接调用执行这段代码,后者需要op()才能调用这段代码,并且传入的参数需要返回一个函数表达式
于是:做了如下测试
object ControllerAbstractTest {
def main(args: Array[String]): Unit = {
test{
println("middle")
}
test2{
println("tset2")
()=>{println("()=>{}")}
}c
}
def test(op : =>Unit) ={
println("start1")
op
println("end1")
}
def test2(op : ()=>Unit)={
println("start2")
op()
println("end2")
}
}
结果如下:
start1
middle
end1
tset2
start2
()=>{}
end2
可以知道,当传入一个函数时,调用时候的执行的代码需要返回一个函数,把这个函数传入当前调用函数中,并且如果需要在这个函数中调用这个函数的话,需要使用参数名(),完整的当作一个函数来使用,否则不会执行函数里面的代码
最后提供对等方案:
1.使用 op :=> Unit
def start(master:String="local[*]")(name:String="application")(op : =>Unit): Unit ={
val sparkConf=new SparkConf().setMaster(master).setAppName(name)
val sc=new SparkContext(sparkConf)
EnvUtil.set(sc)
try {
op
} catch {
case ex => println(ex.getMessage)
}
sc.stop()
}
start("local[*]")("application"){
val wordCountController=new WordCountController()
wordCountController.dispatch()
}
2.使用op : () => Unit
def start(master:String="local[*]")(name:String="application")(op : ()=>Unit): Unit ={
val sparkConf=new SparkConf().setMaster(master).setAppName(name)
val sc=new SparkContext(sparkConf)
EnvUtil.set(sc)
try {
op()
} catch {
case ex => println(ex.getMessage)
}
sc.stop()
}
start("local[*]")("application"){
() =>
val wordCountController=new WordCountController()
wordCountController.dispatch()
}
总结
op : => Unit 表示传入一段执行的代码,只用op就可以执行
op : () => Unit 表示传入一个函数,这个函数 无参 无返回值,可以用代码的形式获取这个函数,但是这个函数需要调用才能执行