Scala中的隐式参数

隐式参数是方法的特殊参数。一个简单的定义是“当没有值作为参数传递给函数时可以使用的预定义值”。

在Scala中,方法可以具有隐式参数,这些隐式参数将隐式关键字作为前缀。使用单个隐式关键字定义的方法中可以有多个隐式参数,并且隐式和常规参数的混合也是可能的。

如果我们在Scala中为方法定义隐式参数。可能有两种情况:

  • 情况1(将值传递给函数时):在这种情况下,该方法将使用传递的值来执行它打算执行的操作。

  • 情况2(当没有值传递给函数时):在这种情况下,该方法将查找所需类型的隐式值。如果找到匹配的值,编译器将自动将其传递给方法。

语法:

具有一个隐式参数的函数:

def function_name (implicit value : type)

具有多个隐式参数的函数:

def function_name (implicit value1 : type, value2 : type)

混合使用隐式参数和常规参数的函数:

def function_name (value1 : type)(implicit value2 : type)

现在,让我们看一些示例,以了解Scala中隐式参数的工作方式。

例1:使用简单的隐式函数

// 程序说明工作原理 
// 隐式参数 
object MyClass {
    // 将使用API​​获取的conversionValue 
    val conversionValue = 74.93; 
    implicit val x : Float = 100
    
    def usdToInrConvertor(implicit usd : Float)={
        val inr = (usd*conversionValue).asInstanceOf[Float] 
        println(f"$usd dollars = $inr Rupees")
   }

    def main(args: Array[String]) {
        println("通过传递值使用隐式参数调用方法 ")
        usdToInrConvertor(50)
        println("带有隐式参数的调用方法而不传递值 ")
        usdToInrConvertor
    }
}

输出:

通过传递值使用隐式参数调用方法 
50.0 dollars = 3746.5 Rupees
带有隐式参数的调用方法而不传递值 
100.0 dollars = 7493.0 Rupees

在上面的代码中,我们创建了一个名为的方法usdToInrConvertor(),该方法用于将USD转换为INR。该方法为要转换的美元值采用参数USD。此值是隐式的。

当我们将值传递给方法时,它使用值(50)进行转换并显示结果。当我们什么都不传递给该方法时,它会寻找一个将要使用的隐式值。

示例2:使用混合使用隐式参数和常规参数的函数

// 演示功能的程序 
// 隐式和常规参数的混合
object MyClass {
    implicit val fullTank : Float = 18
    
    def mileageCal(distance: Float)(implicit fuel : Float)= {
        val mileage = (distance/fuel).asInstanceOf[Float]
        println(f"The bike covered $distance KM in $fuel liters of fuel and gave the milage of $mileage Km/L")
    }
    
    def main(args: Array[String]) {
        println("通过传递值使用隐式参数调用方法 ")
        mileageCal(423)(12.5f)
        println("带有隐式参数的调用方法而不传递值 ")
        mileageCal(541)
    }
}

输出:

通过传递值使用隐式参数调用方法 
The bike covered 423.0 KM in 12.5 liters of fuel and gave the milage of 33.84 Km/L
带有隐式参数的调用方法而不传递值 
The bike covered 541.0 KM in 18.0 liters of fuel and gave the milage of 30.055555 Km/L

在上面的代码中,我们创建了一个方法名称milageCal(),该方法名称将使用车辆的行驶距离和所含燃料作为参数传递给函数来计算车辆的行驶里程。燃料是隐式参数。然后,我们调用了带有和不带有燃料值的方法。并且在两种情况下该函数均会打印正确的值。

示例3:使用具有多个隐式参数的函数

// 演示功能的程序 
// 多个隐式参数
object MyClass {
    implicit val baseSal : Float = 5000
    implicit val baseExp : Int = 0
    
    def salaryCal(implicit lastSalary : Float, exp: Int)= {
        val salary = lastSalary + (lastSalary*(exp)*0.15)
        println(f"The salary of employee is $salary")
    }
    
    def main(args: Array[String]) {
        println("通过传递值使用隐式参数调用方法 ")
        salaryCal(15000.00F, 4)
        println("带有隐式参数的调用方法而不传递值 ")
        salaryCal
    }
}

输出:

通过传递值使用隐式参数调用方法 
The salary of employee is 24000.0
带有隐式参数的调用方法而不传递值 
The salary of employee is 5000.0

在上面的代码中,我们创建了一个名为的方法salaryCal(),该方法计算公司新员工的薪水。该方法采用多个隐式参数作为lastSalaryexp,用于计算。然后,我们调用了带有和不带有这些参数值的方法。并且在两种情况下该函数均会打印正确的值。

要注意的几点例如:

  1. 如果我们传递多个隐式值,则两者的类型应该不同

  2. 调用时,我们需要使用两个参数或不使用任何参数来调用。

注意:

  • 我们使用asInstanceof []方法将类型从double(结果将是double类型)转换为float。我知道这可能会导致数据丢失,但浮动精度对我来说还可以。

  • 为了打印输出,我们使用StringContext类的f方法完成了字符串内插。