У Scala неявні роботи :
Перетворювач
Значення параметра інжектора
Існує 3 типи використання Implicit
Неявне перетворення типу : воно перетворює помилку, що виробляє призначення, у призначений тип
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 видасть помилку. Тому що компілятор scala спочатку шукатиме властивість 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, оскільки параметр 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
Оскільки л має неявний параметр і в рамках тіла методу хрестиків , існує неявна локальні змінне ( параметри є локальними змінними ) , яка є параметром х , так що в тілі х методи методи підписи одиниці неявне значення аргументу знаходиться поданий в локальному змінному неявному методі хрестиків (параметр) неявно . 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} потребує явного переходу значення в аргументі або неявного значення val в області застосування .
Таким чином , ми можемо зробити функцію літерал параметра явно неявно , коли ми називаємо метод х
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))
}