叽叽喳喳,嘻嘻哈哈

导航

scala -- 传名参数

object Test{
  def main(args: Array[String]): Unit = {

    def test(code : => Unit){// 传名参数 不计算函数值,而是把函数当作一个整体传进去,在test内部运行该参数函数
      println("start")
      code
      println("end")
    }
    test{
      println("when evaluated")
      println("bb")
    }
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
    def test1(code: ()=>Unit){ // 普通的传参,也就是传值参数  首先计算参数函数的结果,然后把结果传给test1 函数。
      println("start")
      code() //必须带() 不然不会调用
      println("end")
    }
    test1 {
      println("when evaluated")
      ()=>{println("bb")}
      println("haha")
    }
  }

}

/* 如下为某个人分析的结果

Scala没有什么代码块的概念。这个例子我也看了半天,实际上,在第二例当中,test1的参数是一个表达式。在Scala中,如果将要传入的参数正好是一个,则可以用花括号。这时候test1的参数列表是一个表达式,而这个表达式的结果是最后一行的返回,也就是一个函数() => { println("bb") },它被传给了test1的唯一参数。然后test1方法体执行。至于为什么when evaluated在另外三行之前,是因为它是在传参的时候,求表达式值的副产物。
其实code :=> Unit就是code : () => Unit,只是第一种是按名传参,用花括号可以把花括号内的所有东西作为一个函数传给code;第二种就是普通传参,但是它刚好只有一个参数。这时候用了花括号,就是花括号内表达式的值传进去了
*/
// 上面这个例子是  http://scalagroup.group.iteye.com/group/topic/26303  这个地方来的。。

posted on 2017-07-22 08:54  叽叽喳喳,嘻嘻哈哈  阅读(273)  评论(0编辑  收藏  举报