在scala中,隐式的工作方式是:
转换器
参数值注入器
隐式使用有3种类型
隐式类型转换:它将产生错误的赋值转换为预期的类型
val x:String =“ 1”
值y:Int = x
String不是Int的子类型,因此错误在第2行发生。要解决该错误,编译器将在范围内寻找具有隐式关键字并采用String作为参数并返回Int的方法。
所以
implicit def z(a:String):Int = 2
val x :String = "1"
val y:Int = x // compiler will use z here like val y:Int=z(x)
println(y) // result 2 & no error!
隐式的接收者转换:我们通常通过接收者调用对象的属性,例如。方法或变量。因此,要由接收方调用任何属性,该属性必须是该接收方的类/对象的成员。
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
mahadi.haveTv // Error happening
在这里mahadi.haveTv将产生错误。因为scala编译器将首先向mahadi接收器寻找haveTv属性。找不到。其次,它将寻找具有隐式关键字的范围内的方法,该方法以Mahadi对象作为参数并返回Johnny对象。但是这里没有。因此会产生错误。但是以下是可以的。
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
implicit def z(a:Mahadi):Johnny = new Johnny
mahadi.haveTv // compiler will use z here like new Johnny().haveTv
println(mahadi.haveTv)// result Sony & no error
隐式参数注入:如果我们调用方法而不传递其参数值,则将导致错误。Scala编译器的工作方式如下-首先会尝试传递值,但不会获得参数的直接值。
def x(a:Int)= a
x // ERROR happening
其次,如果参数具有任何隐式关键字,它将在作用域中查找具有相同类型值的任何val。如果没有得到它将导致错误。
def x(implicit a:Int)= a
x // error happening here
为了解决这个问题,编译器将查找具有Int类型的隐式val,因为参数a具有隐式关键字。
def x(implicit a:Int)=a
implicit val z:Int =10
x // compiler will use implicit like this x(z)
println(x) // will result 10 & no error.
另一个例子:
def l(implicit b:Int)
def x(implicit a:Int)= l(a)
我们也可以这样写:
def x(implicit a:Int)= l
因为l有一个隐式参数,并且在方法x的主体范围内,所以存在一个隐式局部变量(参数是局部变量)a,它是x的参数,因此在x 方法的主体中,方法签名l的隐式参数值是由x方法的局部隐式变量(参数)a
隐式归档。
所以
def x(implicit a:Int)= l
将像这样在编译器中
def x(implicit a:Int)= l(a)
另一个例子:
def c(implicit k:Int):String = k.toString
def x(a:Int => String):String =a
x{
x => c
}
它会导致错误,因为Ç在X {X => C ^}需要显式传值在参数或隐式VAL 范围。
因此,当我们调用方法x时,可以使函数文字的参数显式隐式
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
这已在“播放框架”的动作方法中使用
in view folder of app the template is declared like
@()(implicit requestHreader:RequestHeader)
in controller action is like
def index = Action{
implicit request =>
Ok(views.html.formpage())
}
如果您未将请求参数明确提及为隐式,则您必须已经写成-
def index = Action{
request =>
Ok(views.html.formpage()(request))
}