关于Scala中的控制抽象,遇到的问题,op : =>Unit 和op : ()=>Unit的区别

18 篇文章 0 订阅
16 篇文章 1 订阅

问题描述:

今天需要写一段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 表示传入一个函数,这个函数 无参 无返回值,可以用代码的形式获取这个函数,但是这个函数需要调用才能执行

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值