利用Scala的隱式轉(zhuǎn)換,擴(kuò)展對(duì)象方法


Int對(duì)象是沒有判斷當(dāng)前數(shù)是不是質(zhì)數(shù)的方法的,所以一般都是直接寫在方法里去判斷,或者抽離成方法去調(diào)用,舉個(gè)例子

原始方式

 //1-100內(nèi)的質(zhì)數(shù)
import util.control.Breaks._
object NumberTest {
  def printEven() = {
    for (i <- 0 to 100) {
      breakable {
        i match {
          case i if i < 1 => break
          case 1 | 2 | 3 => print(i + ",")
          case i if (canNotExcept(i)) => print(i + ",")
          case _ => break
        }
      }
    }
  }

  def canNotExcept(i: Int): Boolean = {
    val half = i / 2
    var flag = true
    breakable {
      for (n <- 2 to half) {
        if (0 == i % n) {
          flag = false
          break
        }
      }
    }
    flag
  }
}

隱式轉(zhuǎn)換轉(zhuǎn)換方式

如果想讓Int直接帶有判斷質(zhì)數(shù)的能力,基本不太可能
但是如果換一種思路:把Int轉(zhuǎn)換成一個(gè)能判斷自己是不是質(zhì)數(shù)的類型,就好了啊

轉(zhuǎn)換類

    implicit class IntUtil(i: Int) {
      // 判斷數(shù)字為質(zhì)數(shù)
      def isPrime: Boolean = {
        i match {
          case i if 1 > i => false
          case 1 | 2 | 3 => true
          case i => {
            val half = i / 2
            if (except(half)) false else true
          }
        }

      }

      // 判斷數(shù)字不是質(zhì)數(shù)
      def isNotPrime: Boolean = !isPrime

      //尾遞歸,判斷能佛被比divisor小的數(shù)整除
      @tailrec
      final def except(divisor: Int): Boolean = {
        if (2 == divisor )  0 == i % divisor
        else if (0 == i % divisor) true
        else except(divisor - 1)
      }
    }

使用更方便

import util.control.Breaks._
// 引入自定義的隱式轉(zhuǎn)換
import com.zing.my.IntUtil._

object NumberTest {
  def printEven() = {

    for (i <- 0 to 100) {
      breakable {
// i 會(huì)直接隱式轉(zhuǎn)換成IntUtil類型,然后就可以使用isNotPrime方法了
        if (i.isNotPrime) {
          break
        }
        print(i + ",")
      }
    }
  }
}

小結(jié)

大佬說,尾遞歸是函數(shù)式編程的精髓之一,而隱式轉(zhuǎn)換是Scala的精髓之一。我玩Scala大約一周了,暫時(shí)的體會(huì)是用起來真爽,看起來真難懂。
本文展示了使用隱式類型,幫助擴(kuò)展原有類的方法,雖然實(shí)質(zhì)上是把原有類型轉(zhuǎn)換成新類型,但是寫起來看著就是方法被擴(kuò)展了。

優(yōu)點(diǎn)是:

  • 可以更加方便的對(duì)類型進(jìn)行擴(kuò)充,不限于方法,也可以是屬性,方法參數(shù)等
  • 合適情況下可讀性也更強(qiáng),更加專注于邏輯而不是實(shí)現(xiàn)細(xì)節(jié)

缺點(diǎn)是:

  • IDEA無法自動(dòng)幫你導(dǎo)入隱式函數(shù)或者類,只能自己手工來
  • 不合適的情況下大佬隱藏了細(xì)節(jié),導(dǎo)致初學(xué)者完全不知道為什么直接就調(diào)用到了方法。不知> 道實(shí)現(xiàn)的邏輯

隱式轉(zhuǎn)換的原理其實(shí)就是編譯器發(fā)現(xiàn)編譯不能直接進(jìn)行,再嘗試你導(dǎo)入的隱式轉(zhuǎn)換,轉(zhuǎn)換成功了就編譯成轉(zhuǎn)換后的結(jié)果,不成功,那就真的不成功了。

PS: 這里的break是一個(gè)方法哦,Scala是沒有breakcontinue

參考

工具書:《Scala編程 第三版》

喜歡請(qǐng)點(diǎn)個(gè)贊
轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/u/4915ed24d1e3
如有錯(cuò)誤,請(qǐng)務(wù)必指正。謝謝
我的博客:https://xzing.github.io/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容