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