스칼라에서는 암시 적으로 다음 과 같이 작동합니다 .
변환기
매개 변수 값 인젝터
암시 적 사용에는 3 가지 유형이 있습니다.
암시 적으로 유형 변환 : 오류 생성 할당을 의도 한 유형으로 변환합니다.
val x : String = "1"
val y : Int = x
문자열 은 Int 의 하위 유형 이 아니므로 2 행에서 오류가 발생합니다. 오류를 해결하기 위해 컴파일러는 묵시적 키워드가 있고 문자열 을 인수로 사용하고 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 는 오류를 생성합니다. 스칼라 컴파일러는 먼저 hasHv 속성을 mahadi 수신기 로 찾습니다 . 찾을 수 없습니다. 두 번째로 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
암시 적 매개 변수 주입 : 메서드를 호출하고 매개 변수 값을 전달하지 않으면 오류가 발생합니다. 스칼라 컴파일러는 다음과 같이 작동합니다-먼저 값을 전달하려고 시도하지만 매개 변수에 대한 직접적인 값은 얻지 않습니다.
def x(a:Int)= a
x // ERROR happening
둘째, 매개 변수에 암시 적 키워드가 있으면 범위 에서 동일한 유형 의 값 을 가진 모든 val 을 찾습니다 . 그렇지 않으면 오류가 발생합니다.
def x(implicit a:Int)= a
x // error happening here
이 문제를 해결하기 위해 컴파일러는 매개 변수 a 에 암시 적 키워드 가 있기 때문에 Int 유형의 암시 적 val 을 찾습니다 .
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
때문에 난 갖는 암시 파라미터 와의 범위에 있어서의 X의 신체 ,가 암시 로컬 변수 ( 파라미터 로컬 변수 ) 의 파라미터 인 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
}
이 때문에, 에러가 발생할 C 에서 , X = {X> C}는 명시 적 값 통과 인수 또는 암시 적으로 발해야 범위 .
따라서 x 메소드를 호출 할 때 함수 리터럴의 매개 변수를 명시 적 으로 암시 적으로 만들 수 있습니다.
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
이것은 Play-Framework의 액션 방법 에 사용되었습니다
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))
}