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)
}

Scala--隐式参数_第1张图片

使用作用域来限制隐式参数在某一个区域中, 在需要的时候, 直接引入

//通过输入购物金额, 结合当前域中的隐式参数来计算税费
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)}")
}

Scala--隐式参数_第2张图片

//通过输入购物金额, 结合当前域中的隐式参数来计算税费
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)

}

你可能感兴趣的:(scala)