zoukankan      html  css  js  c++  java
  • scala-- 内建控制结构

    内建控制结构

    ​ scala 内建的控制结构很少,只有 if while for try match函数调用 几种。 因为scala 从语法层面支持函数字面量。几乎所有的scala控制结构都会产生值.函数式语言把程序看成是计算值的活动。

    if
    object InBuildControl {
      def main(args: Array[String]): Unit = {
        var filename = "default.txt"
        if ( ! args.isEmpty)
          filename = args(0)
      }
    } // 指令式风格
    
    object InBuildControl {
      def main(args: Array[String]): Unit = {
        val filename =
            if (! args.isEmpty) args(0)
            else "defult.txt"
        println(filename)
      }
    } //函数式风格
    
     println(if (! args.isEmpty) args(0) else "default.txt")
    
    while
    object InBuildControl {
      def main(args: Array[String]): Unit = {
        println(gcdLoop(6,4))
      }
      def gcdLoop(x: Long,y: Long): Long = { //这就求分子字母最大公约数的一个程序
        var a = x
        var b = y
        while (a != 0){
          val temp = a
          a = b % a
          b = temp
        }
        b
      }
    }
    
        var line = ""
        do{
          line = readLine() //readline()该方法已经过时了
          println("read" + line)
        }while (line != "")
      } //do...while 循环
    

    Unit类型的值是 unit ,写为 ()

    给变量赋值操作等式本身返回的也是unit 值

    纯指令式风格(递归)实现 求解最大公约数

    def gcd(x:Long,y:Long):Long =  if (y == 0)x else gcd(y,x%y)
    
    for
      for (i <- 1 to 5) println(i) // 12345
      for (i <- 1 until 5) println(i) //1234
      for (i <- 1 until 5 if i > 2) println(i) //34  if 过滤
      /*
        i <- 1 to 5   
        1 to 5 是 Range 类型 
        i <- 1 to 5  是发生器(generator)(python叫生成器),每一次枚举,名为  i 的新的 val 就被元素值初始化。编译器能够推断出它是Int类型。
      */  
      
    
        for (
          i <- 1 to 10
          if i > 2
          if i % 2 != 0
        )print(i) //多个条件过滤  i>2 且 i%2 !=0 才运行此打印命令
    
     val filesHere = (new  java.io.File(".")).listFiles
      def fileLines(file: java.io.File) =
        scala.io.Source.fromFile(file).getLines.toList
      def grep(pattern: String) = {
        for(
          file <- filesHere
          if file.getName.endsWith(".scala")
          line <- fileLines(file)
          if line.trim.matches(pattern) //多层嵌套
        )println(file + ":" + line.trim)
      }
    
    #类似于:
    for file in filesHere:
        if file.endswith(".scala"):
            for line in file.readlines():
                if line.strim.matches(pattern):
                    print (file + ":" + line.trim)
    
    val filesHere = (new  java.io.File(".")).listFiles
      def fileLines(file: java.io.File) =
        scala.io.Source.fromFile(file).getLines.toList
      def grep(pattern: String) = {
        for(
          file <- filesHere
          if file.getName.endsWith(".scala")
          line <- fileLines(file)
          //if line.trim.matches(pattern) //多次用到了 line.trim 
          trimmed = line.trim //流式变量 trimmed 是val 类型的,
          if trimmed.matches(pattern)
        )//println(file + ":" + line.trim)
    	println(file + ":" + trimmed)  
    }
    
    
     val filesHere = (new  java.io.File(".")).listFiles
      def fileLines(file: java.io.File) =
        scala.io.Source.fromFile(file).getLines.toList
      def grep(pattern: String) = {
        for(
          file <- filesHere
          if file.getName.endsWith(".scala")
          line <- fileLines(file)
          if line.trim.matches(pattern) //多层嵌套
        ) yield line.trim.length // 返回每一行去掉空格之后的长度
      } // 最终返回一个数组 Array[Int]
    
    try

    使用throw 抛出异常

    先创建一个异常对象,然后用throw 抛出

    throw new IllegalArgumentException
    
        var aNum = 5
        if(aNum % 2 == 0)
          print("haha")
        else
          throw new RuntimeException("anum must be even")// throw 抛出的异常类型为Nothing,因此得到的值为Nothing
    
      var aNum = 5
        try{
          if(aNum % 2 == 0)
            print("haha")
          else
            throw new RuntimeException("anum must be even")
        }catch {
          case ex:RuntimeException =>print("aiyou") //捕获 Run...异常,然后调用指定的函数
          case ex:IllegalArgumentException => print("hehe") //如果异常不再这两个case之内,那么就会向上传导
        }
    

    try...catch...finally

    def urlFor(path: String)={
        try{
          new URL(path)
        }catch{
          case e: MalformedURLException =>new URL("https://www.baidu.com")
        }finally {
            print("iiiii")
        }
      }
    
      def f():Int = try{ return 1} finally {return 2} // 始终返回 2,其实是 2覆盖了 1
      def g():Int = try{1} finally {2}  //返回1
    
    match
      val aArg = "aha"
        aArg match{
          case "haha" =>println("right") //隐含了break
          case "hehe" => println("wrong") // case 后面接的不止是Int,String类型,可以是任何类型的常量或其他东西。
          case _ => println("i dont't know") // _ 占位符, 表示默认情况 _ 是常用的用来匹配未知变量的通配符。 
        } 
    
        val aArg = "haha"
        val name =
          aArg match{
            case "haha" => "right" // 返回值
            case "hehe" => "wrong"
            case _ => "i don't know"
          }
        println(name)
    

    scala 中 没有 break 和continue

    变量的作用范围

    大括号{} 起到引入新的作用范围的作用。大括号能起到遮蔽括号内外同名变量的作用。

    因此不同于java的不能创建同名变量,scala可以在大括号内外创建同名变量。

    object InBuildControl{
      def main(args: Array[String]): Unit = {
        val i = 10
         for(z <- 1 until 2){
          val i = 12
          println(i) //12
        }
        println(i) //10
      }
    }
    

    {} 可以访问父{} 的变量

    object InBuildControl{
      def main(args: Array[String]): Unit = {// 祖 层开始
        val i = 10
        val a = 23
         for(z <- 1 until 2){ //父 层开始
          val i = 12 //遮蔽了祖层的同名变量 i
          println(i) //12
           for (j <- 1 until 2){ //子 层开始
             println(i) //12 虽然祖、父层都有i,但是父层遮蔽了祖层的i,所以这里读取的是父层的i
             println(a) //23  只有祖 层 才有a 所以没有所谓遮蔽 
           }//子层结束
        }//父层结束
        println(i) // 10 打印本层的 i 
      }//祖层结束
    }
    
  • 相关阅读:
    Atitit fms Strait (海峡) lst 数据列表目录1. 4大洋 12. 著名的海大约40个,总共约55个海 13. 海区列表 23.1. 、波利尼西亚(Polynesia,
    Atitit trave islands list 旅游资源列表岛屿目录1. 东南亚著名的旅游岛屿 21.1. Cjkv 日韩 冲绳 琉球 济州岛 北海道 21.2. 中国 涠洲岛 南澳
    Atitit Major island groups and archipelagos 主要的岛群和群岛目录资料目录1. 岛群 波利尼西亚(Polynesia, 美拉尼西亚(Melanesia,
    Atitit glb 3tie city lst 三线城市列表 数据目录1. 全球范围内约90个城市 三线 12. 世界性三线城市全球共
    Atitit glb 1tie 2tie city lst 一二线城市列表数据约50个一线城市Alpha ++ 阿尔法++,,London 伦敦,,New York 纽约,,Alpha +
    Attit 现代编程语言重要特性目录第一章 类型系统 基本三大类型 2第一节 字符串 数字 bool 2第二节 推断局部变量 2第三节 动态类型 2第二章 可读性与开发效率 简单性 2
    Atitit 未来数据库新特性展望目录1. 统一的翻页 21.1. 2 Easy Top-N
    使用Chrome DevTools(console ande elements panel)进行xpath/css/js定位
    chrome -console妙用之定位xpath/js/css
    表达式树之构建Lambda表达式
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7189830.html
Copyright © 2011-2022 走看看