scala初学之函数定义、流程控制、异常处理入门

特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能了解一些东西的;但是很多东西讲的确实欠缺;所以在学习的过程中把自己的很多思考注释到了他的代码中。一是当作自己的备忘,二也希望能够给大家带来一些些的帮助。

 

进入正文:

 

 

package com.dt.scala.hello

/**
 *
 * 这是第二集视频中的代码
 * 主要将函数的定义、函数的调用、if判断、循环和控制、异常处理、静态代码块 
 *
 * */
object ScalaBasics {//在object中所有的一切都是静态的(包括方法和代码块)
  
  //1.方法的定义
  //1.1无参方法的定义
  /*def就是用来定义方法的 ;doWhile是方法的名称;Unit是返回类型,相当于java中的void */
  def doWhile(): Unit={
    /*
     * 这是一种完全的写法,下面的写法也是正确的
     * 
     * def doWhile(){}
     * def doWhile()={}
     * def doWhile{}
     * def doWhile={}
     * def doWhile:Unit={}
     * 
     * 但是这种定义是不正确的
     * def doWhile():Unit{}
     * 
     * 为什么可以省略返回值类型呢?因为scala会把最后一行的变量或者运行结果当作返回值,那么返回值的类型也就由
     * scala的类型推断机制来完成了 (Unit也是一种变量类型和运行结果)
     * */
    
    
    //又想起了scala中一个语句后面是不需要写那个;号的,其实挺爽的,写上一万行代码就少敲一万下键盘不是么
    var line = ""  //这里定义了一个var 类型的变量 这里用var的话,就是说这个line变量可以被多次赋值
    			//也就是说,我写了line = "123";line = "456";这样的多次赋值是可以被接受的。
                //在java中我们定义一个字符串的时候是这样的 String line = "";这个line在java中也可以被无数次的赋值
    			//其实严格的说scala中我们定义一个字符串的话应该这样来写 var line:String =""
                //但是我们却可以直接写成 var line =""
    			//主要因为两点  第一、scala中的变量必须初始化 第二、scala中提供了自动的类型转换 
                //首先来说第一点,我们在java中这样写 String line;是正确的。但是在scala中如果写 
                //var line:String 错误
                //var line 错误
    			//var line:String;错误
    			//var line;错误
                //只有var line:String="" 和 var line=""是正确的
      
                //第二点  scala中体中了自动类型转换,也就是说 由于我的变量必须赋值,那么变量的类型完全可以又变量的值来推出
                //因此 var line:String=""也就变成了var line = "" 不得不说又少敲键盘了
    /**********************************************************************************************/
     /*和var相对立的还有一个 叫val的标识符,和var一样,val也必须初始化,也可以省略掉变量的类型
      * 唯一不同地方就是 val 标识的变量初始化以后是不可再赋值的 相当于java中在变量前加上了final关键字一样
      * 例如 val line = "" ;然后再赋值 line="123"就会报错 ;如同java中的 final String line ="";一样
      * 在scala中更加鼓励使用val来定义变量,(个人理解,这个对于减少方法的副作用有帮助,同时有利于多线程和函数式编程)
      * */
      do{//和java中的do-while循环是一样的
        line=readLine()//相当于java中的new Scanner(System.in).nextLine(); 这个readLine在scala。Predef包中,scala默认引入该包
        				//其功能就是读入一行用户的输入并赋值给line
        //也可以简写为 line = readLine
      	println("Read: " + line)//输出  相当于java中的System.out.println(-------);
      }while(line != "")//循环条件为line不是空字符串
  }//调用见main函数中的1.1
  
  //1.2 带参数和返回值的方法的定义
  // def用来定义函数 looper函数名  x:Long,y:Long 两个Long类型的参数  ):Long 返回值类型
  def looper(x : Long,y :Long): Long={
    /*关于方法签名的各种省略写法和doWhile是一致的*/
    var a=x
    var b=y//分别把x和y赋值给了var类型的a和b
    //因为下边要在循环中不停的修改a和b的值所以是var来定义
    //那为什么不直接操作x和y呢
    //因为x和y都是val类型的, 也就是所在scala的所有方法中参数都是val类型的也就是说如果用java来描述这个函数的话应该是这样
    // public static Long looper(final Long x,final Long y){}
    //在java的代码重构中提到针对与函数的变量的赋值是一种代码的坏味道,可能会引起代码的副作用
    //val对于多线程的处理意义重大,大家可以百度
    while(a!=0){//这就是个循环了 while循环
      var temp=a
      a=b%a
      b=temp
    }
    b//···一个孤零零的b变量,直接作为了返回值  乐意的话加上 return也可以 
  }//函数调用剑main中的1.2
  
  

  def main(args: Array[String]): Unit = {
    //1.1
    doWhile //调用doWhile函数  当然写成doWhile()也是正确的,这里又是简写了
    
    //1.2
    println(looper(100,298))//直接输出函数的调用结果
  
    //2 if语句
    //2.1 scala中的if判断
    var file = "scala.txt"
    if(!args.isEmpty) file=args(0)//如果传入的参数不为空,赋值为args(0)

    //2.2 对2.1的简写
    var fileo = if(!args.isEmpty) args(0) else "scala.txt"
    //看起来挺新鲜,其实就是java中的 String x = !args.isEmpty()?args(0):"scala.txt";
      
    /*两个输出   没啥好说的*/        
    println(fileo)
    println(file)
    
    //3 for循环
    //3.1
    for(i <- 1 to 10){//在java中我们写for(int i=1;i<=10;i++)
                      //首先看看这个 1 to 10 其实是一个语法糖,在scala中做到了一切皆对象,
                      //所以你写个 1 我去这也是一个对象(scala会通过隐士转化的方式把你的1转换为一个RichInt对象)
    				  //所以呢 to就是1的一个方法 本尊应该这样写 1.to(10) 这个方法返回一个Range··也就是一个java中的list的意思
    				  //所以 <- 这个东西就是 把 1.to(10) 的返回值依次赋给i然后进入循环体中运行
      println("Number is:" +i)
    }
   //3.2 由3.1的分析可以知道 这样写也是对的
   for(i <- 1.to(10)){
	    println("Number is:" +i)
	 }
    
   
   //3.3 scala中的增强for循环 相当于java中的for(String x:list){}
   val files= (new java.io.File(".")).listFiles()//这句不用管,就是返回当前目录下的所有文件的一个Array对象
   for(file <-files){//把files依次赋值给file,进入循环体中运行
	   				//我觉得这个就不要说什么增强的for了
	   				//因为2.1可以这样写啊
	   				//val test=1 to 10
	   				//for(i <- test){
	   				//println("Number is:" +i)
	   				//}
	   				//所以只不过是把list的获得放在for()在外和之内的区别,没有像王某说的还有个增强for循环
     println(file)
   }

  
  //4 初次接触scala中的异常处理
   
  val n = 99
  try {//和java一样,使用try catch finally 结构来做异常处理 ;唯一的改变就是在catch处
    
      //抛出一个运行时异常
	  val half =if(n%2==0) n/2 else throw new RuntimeException("n must be even")
  }catch{
    //在java中是
    //catch(xxxxException e){}
    //..........
    //catch(Exception e){}
    //为了处理异常我们会写一档对的catch函数,然后在不同的catch函数中针对特定的异常进行处理
    //在scala中直接省去了对异常的传入,而且永远只有一个catch了
    //针对不同的catch我们可以这样写
    //catch{
    //case e:xxxxException => doSomeThing
    //...
    //case e:Exception => doSomeThing
    //}
    //这样写比起java中的一堆堆看起来要舒心了很多啊
    
    //case 用来作为一个分支判断  e:Exception 用来指定异常的类型 是case的判断条件 如果 也就是如果
    //e匹配Exception类型,那么 => 指向了要执行的操作
    case e:Exception => println("The Exception is : "+e.getMessage())
  }finally{//和java中的finally的作用相同
    
  }
  
  }

  
    //静态代码块 由于在object中所有的所有都是静态的,所以包括一个语句都是静态的
    //java中的static{...}在类加载的时候就会执行
  	//这里的三行代码也是一样的,他们没有包含在任何的方法体中,会在代码加载的时候执行 而且是在main函数调用之前执行
    var line=""
    line=readLine()
    println("Read_Out: " + line)
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值