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