14.9 控制抽象(Control Abstraction)

在 Scala 给我们提供了为数不多的几种控制: if, for, while等.

我们可以利用 Scala 强大的抽象能力, 可以自己实现控制结构.

看下面的高阶函数的代码:

package com.atguigu.day13

object ControlAbstract {
  def main(args: Array[String]): Unit = {
    // 定义一个可以在线程内执行传入的函数的函数
    def runInThread(foo: () => Unit): Unit = {
      new Thread() {
        override def run(): Unit = foo()
      }.start();
    }

    // 调用函数
    runInThread(() => println("thread...."))
  }
}

14.9 名调用表示法

由于 runInThread 的参数函数既没有参数又没有返回值, 所以可以使用名调用表示法:

在参数声明和函数调用的地方省略()

变成下面的样式:

// 参数部分省略 (), 但是 => 不可以省略
def runInThread(foo: => Unit) {
  new Thread() {
    override def run(): Unit = foo // foo的调用则不能再添加()
  }.start();
}

// 调用函数的时候 ()=> 省略. 只写函数体即可
// 此处看起来更像一个代码块
runInThread {
  println("thread....")
  println("哈哈哈")
}

说明:

  • 只有当参数函数为无参时候才可以这样省略.

  • 看起来很爽: runInThread 像编程语言中的关键字.😁


14.10 定义mywhile"关键字"

我们利用前面的换名调用表示法和函数的柯里化来抽象出来一个类似系统的while的关键字:mywhile

package com.atguigu.day13

object MyWhile {
  def main(args: Array[String]): Unit = {
    var a = 0
    mywhile(a < 10) {
      println(a)
      a += 1
    }
  }

  def mywhile(condition: => Boolean)(foo: => Unit): Unit = {

    if (condition) {
      foo
      mywhile(condition) {
        foo
      }
    }
  }
}

补充:

// 名调用和值调用
object NameValueCall {
    def main(args: Array[String]): Unit = {
        def f() = {
            println("f...")
            10
        }

        foo1(f())
        foo1(f())
        foo2(f())
        foo2(f())
        foo2(f())
        foo2 {
            println("f...")
            10
        }
    }

    // 值调用
    def foo1(num: Int) = {
        println(num)
        println(num)
    }

    // 名调用  换名调用
    def foo2(num: => Int) = {
        println(num) //
        println(num)
        println(num)
        println(num)
        println(num)
    }
}

/*
名调用
    一种特殊的情况.

值调用
    绝大部分情况都是值调用

 */
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-04-13 09:16:34

results matching ""

    No results matching ""