前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

作者头像
Michael阿明
发布2021-09-06 10:47:17
3590
发布2021-09-06 10:47:17
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

学自 https://www.runoob.com/scala/scala-tutorial.html

1. 类和对象

代码语言:javascript
复制
object myClass {
    import java.io._
    class Point(xc : Int, yc : Int){
        var x : Int = xc
        var y : Int = yc
        def move(dx:Int, dy:Int): Unit ={
            x += dx
            y += dy
            println("x : " + x)
            println("y : " + y)
        }
    }

    // 继承,只能单继承
    class Piont3D( val xc : Int, val yc : Int,
                  val zc : Int) extends Point(xc, yc){
        var z : Int = zc
        def move(dx:Int, dy:Int, dz:Int): Unit ={
            x += dx
            y += dy
            z += dz
            println("x : " + x)
            println("y : " + y)
            println("z : " + z)
        }
    }
    def main(args: Array[String]) = {
        val p1 = new Point(10, 20)
        p1.move(2, 3)
        // x : 12
        // y : 23

        val p2 = new Piont3D(10, 30, 50)
        p2.move(1,2,3)
        // x : 11
        // y : 32
        // z : 53

        val fred = new Employee
        fred.name = "Fred"
        fred.salary = 50000
        println(fred) // myClass$Employee[name=Fred][salary=50000.0]
    }
    class Person {
        var name = ""
        override def toString = getClass.getName + "[name=" + name + "]"
    }

    class Employee extends Person {
        var salary = 0.0
        override def toString = super.toString + "[salary=" + salary + "]"
    }
}

2. Trait

代码语言:javascript
复制
	// Trait 特征, 很像 Java 的抽象类
    trait Equal {
        def isEqual(x : Any) : Boolean
        def isNotEqual(x : Any) : Boolean = !isEqual(x)
    }
    class Point2(xc : Int, yc : Int) extends Equal {
        var x : Int = xc
        var y : Int = yc
        def isEqual(obj : Any) = {
            obj.isInstanceOf[Point2] && obj.asInstanceOf[Point2].x == x
        }
    }

必须实现 没有实现的isEqual,或者 声明 Point2 为抽象类 abstract class Point2

代码语言:javascript
复制
		val p3 = new Point2(2, 3)
        val p4 = new Point2(2, 4)
        val p5 = new Point2(3, 3)

        println(p3.isNotEqual(p4)) // false
        println(p3.isNotEqual(p5)) // true
        println(p3.isNotEqual(2)) // true

3. 模式匹配

代码语言:javascript
复制
object myMatch {
    def main(args: Array[String]) ={
        println(matchTest(3)) // many
        println(matchTest(2)) // two
        println(matchTest(1)) // one

        println(matchTest1("two")) // 2
        println(matchTest1("test")) // others
        println(matchTest1(1)) // one
        println(matchTest1(6)) // isInt, 顺序遇到符合的就退出,剩余的不匹配

        val alice = new Person("alice", 18)
        val bob = new Person("bob", 19)
        val michael = new Person("michael", 20)
        for(p <- List(alice, bob, michael)){
            p match {
                case Person("alice", 18) => println("hi, alice")
                case Person("bob", 19) => println("hi, bob")
                case Person(name, age) => println(name + " " + age)
            }
        }
        // hi, alice
        // hi, bob
        // michael 20

    }
    def matchTest(x : Int) : String = x match {
        case 1 => "one"
        case 2 => "two"
        case _ => "many" // 类似 default
    }
    def matchTest1(x : Any) : Any = x match {
        case 1 => "one"
        case "two" => 2
        case y : Int => "isInt" // 是不是 Int 类型
        case _ => "others"
    }

    // 样例类
    case class Person(name : String, age : Int)
}

4. 正则

代码语言:javascript
复制
		// 正则表达式
        import scala.util.matching.Regex
        val pat1 = "Scala".r
        val s = "Scala is scalable and cool"
        println(pat1 findFirstIn s) // Some(Scala)
        val pat2 = new Regex("(S|s)cala") // 首字母 S or s
        println((pat2 findAllIn s).mkString(" - ")) //使用分隔符连接所有匹配
        // Scala - scala
        println(pat2 replaceFirstIn(s, "Java"))
        // Java is scalable and cool
        println(pat2 replaceAllIn(s, "Java"))
        // Java is Javable and cool

5. 异常处理

代码语言:javascript
复制
		// 异常处理
        import java.io.FileReader
        import java.io.FileNotFoundException
        import java.io.IOException
        try{
            val f = new FileReader("input.txt")
        }
        catch {
            case e : FileNotFoundException => {
                println("missing file!")
            }
            case e : IOException => {
                println("IO Exception")
            } // 一般把具体的异常写在前面,否则捕获了一个普遍的异常,后面的具体异常没有捕获
        }
        // missing file!
        finally { // 都会执行的部分
            println("finally step")
        } // finally step

6. 提取器

代码语言:javascript
复制
		// 提取器是一个带有unapply方法的对象
        def apply(user : String, domain : String) = {
            user + "@" + domain
        }
        def unapply(email : String) : Option[(String, String)] = {
            val parts = email split "@"
            if(parts.length == 2)
                Some(parts(0), parts(1))
            else
                None
        }
        println(apply("michael", "csdn.net")) // michael@csdn.net
        println(unapply("michael@csdn.net")) // Some((michael,csdn.net))
        println(unapply("michael csdn")) // None
代码语言:javascript
复制
object myExtractor {
    //提取器使用模式匹配
    def main(args : Array[String]) = {
        val x = myExtractor(5) // 自动调用apply
        println(x) // 10

        x match{ // 在提取器对象中使用 match 语句是,unapply 将自动执行
            case myExtractor(num) => println(x, num) // 自动调用 unapply (10,5)
            case _ => println("无法计算")
        }
    }
    def apply(x : Int) = {
        x*2
    }
    def unapply(z : Int) = {
        if(z%2 == 0)
            Some(z/2)
        else
            None
    }
}

7. 文件 IO

代码语言:javascript
复制
object MyIO {
    import java.io._

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

        // 写入文件
        val writer = new PrintWriter(new File(("test.txt")))
        writer.write("scala hah\nhello michael") // 产生文件 test.txt (内容scala hah...)
        writer.close()

        // 从屏幕获取输入
        val input = scala.io.StdIn.readLine()
        println(input) // 讲输入的内容打印出来

        // 从文件读取
        import scala.io.Source
        Source.fromFile("test.txt").foreach{
            print
        }
        // scala hah
        // hello michael
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 类和对象
  • 2. Trait
  • 3. 模式匹配
  • 4. 正则
  • 5. 异常处理
  • 6. 提取器
  • 7. 文件 IO
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档