scala的隐式对象和隐式类

23 阅读1分钟

隐式类

  • 隐式类。
  • implicit class
  • 作用:在不修改原来类的基础之后,增加新的功能
object imp04 {
  class User() {
    def insertUser():Unit = {
      println("insertUser......")
    }
  }

  implicit class UserStrong(user:User) {
    def updateUser():Unit = {
      println("updateUser......")
    }
  }

  // implicit def xxxxx(user:User):UserStrong = {
  //   println("自动调用隐式转换函数......")
  //   new UserStrong
  // }

  def main(args: Array[String]): Unit = {
    val u1 = new User()
    u1.insertUser()
    // val u2 = new UserStrong()
    u1.updateUser()
    // u2.updateUser()
  }
}

案例:验证字符串是否手机号

目标:让任意一个字符串具备一个功能:判断是否是一个合法的手机号。

String类是系统提供的,并没有isPhone这个方法。

现在就要去在不修改String类的情况下,增加这个方法。

object imp05 {
  implicit class StrongString(s:String) {
    // 手机号验证方法
    def isPhone:Boolean = {
      val reg = "^1[35678]\d{9}$".r
      reg.matches(s)
    }

    // 补充:身份证号验证方法(简化版,实际身份证规则更复杂)
    def isIDCard:Boolean = {
      // 18位身份证正则(简化:前17位数字 + 最后1位数字/字母Xx)
      val reg = "^\d{17}[0-9Xx]$".r
      reg.matches(s)
    }
  }

  def main(args: Array[String]): Unit = {
    val str = new String("13617295643")
    println(str.isPhone)
    println("134567891a".isPhone)
    println("130567891a".isPhone)
    println("429005202011012231".isIDCard) // true
    println("40900520201101223a".isIDCard) // false
  }
}

案例:计算阶乘

目标:让任意一个整数具备一共功能:计算阶乘

n! = 123*...*n

5! = 12345 = 120

import scala.language.postfixOps
object imp06 {

  implicit class StrongInt(n:Int) {
    def ! :Int = {
      var rst = 1
      for(i <- 1 to n) {
        rst *= i
      }
      rst
    }
  }

  def main(args: Array[String]): Unit = {
    println(4!) // 24
    println(5!) // 120
  }
}