Scala--隱式參數

A method with implicit parameters can be applied to arguments just like a normal method. In this case the implicit label has no effect. However, if such a method misses arguments for its implicit parameters, such arguments will be automatically provided.

如果有參數, 那麼會自動使用, 如果沒有, 你也可以顯示地傳遞

//通過輸入購物金額, 結合當前域中的隱式參數來計算稅費
def calcTax(amount:Float)(implicit rate: Float): Float = {
  amount * rate
}

//創建一個獨立的域測試
{
  //1,顯式輸入, 不使用隱式參數
  calcTax(3000)(0.08F)
}

{
  //2,使用隱式參數, 參數的作用域只是在當前大括號中有效
  implicit val rate = 0.04F
  calcTax(3000)
}

這裏寫圖片描述

使用作用域來限制隱式參數在某一個區域中, 在需要的時候, 直接引入

//通過輸入購物金額, 結合當前域中的隱式參數來計算稅費
def calcTax(amount:Float)(implicit rate: Float): Float = {
  amount * rate
}

//當計算簡單的消費稅時候, 引入該變量
object SimpleStateSalesTax {
  implicit val rate: Float = 0.08F
}

//在一個單獨的域中測試
{
  //引入變量, 一個域中僅能有一個變量
  import SimpleStateSalesTax.rate

  val amount = 3000F
  println(s"Tax on $amount = ${calcTax(amount)}")
}

這裏寫圖片描述

//通過輸入購物金額, 結合當前域中的隱式參數來計算稅費
def calcTax(amount:Float)(implicit rate: Float): Float = {
  amount * rate
}

//當計算簡單的消費稅時候, 引入該變量
object SimpleStateSalesTax {
  implicit val rate: Float = 0.08F
}

//在一個單獨的域中測試
{
  //引入變量, 一個域中僅能有一個變量
  import SimpleStateSalesTax.rate

  val amount = 3000F
  println(s"Tax on $amount = ${calcTax(amount)}")
}


/*
在休假的時候免稅, 在不同的地方收不同的附加稅
*/

//複雜稅費的數據保存類, 使用case類
case class ComplicatedSalesTaxData(
  baseRate: Float,          //基礎稅率
  isTaxHoliday: Boolean,    //是否是免稅日
  storeId: Int)             //店鋪的id, 當地的附加稅

object ComplicatedSalesTax {
  //根據店鋪號碼計算附加稅率
  private def extraTaxRateForStore(id:Int):Float = {
    if(id<1000) 0.1F      //附加稅率爲0.1
    else 0.15F            //附加稅率爲0.15
  }

  //根據一個納稅數據體, 計算稅率
  implicit def rate(implicit cstd: ComplicatedSalesTaxData):Float = {
    //免稅期
    if(cstd.isTaxHoliday) 0.0F
    //基礎稅率, 加上附加稅率
    else cstd.baseRate + extraTaxRateForStore(cstd.storeId)
  }
}

{
  import ComplicatedSalesTax.rate
  implicit val myStore = ComplicatedSalesTaxData(0.06F, false, 1200)
  val amount = 3000
  calcTax(amount)

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章