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 
      }//祖层结束
    }
    
  • 相关阅读:
    [BZOJ1565][NOI2009]植物大战僵尸
    [BZOJ1566][NOI2009]管道取珠
    [BZOJ4104][Thu Summer Camp 2015]解密运算
    [BZOJ1003][ZJOI2006]物流运输
    [BZOJ3790]神奇项链
    指纹模块原理_光学指纹模块原理
    Ubuntu 16.04无损分区大小调整工具Gparted
    16进制转换10进制
    Memory Ordering in Modern Microprocessors
    python 多态
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/7189830.html
Copyright © 2011-2022 走看看