Trong scala ngầm hoạt động như :
Bộ chuyển đổi
Thông số giá trị kim phun
Có 3 loại sử dụng ngầm
Chuyển đổi kiểu ngầm định : Nó chuyển đổi việc tạo ra lỗi gán thành loại dự định
val x: Chuỗi = "1"
val y: Int = x
Chuỗi không phải là kiểu con của Int , do đó, lỗi xảy ra trong dòng 2. Để giải quyết lỗi, trình biên dịch sẽ tìm một phương thức như vậy trong phạm vi có từ khóa ẩn và lấy String làm đối số và trả về một Int .
vì thế
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!
Chuyển đổi người nhận ngầm định : Chúng tôi thường bằng các thuộc tính của đối tượng cuộc gọi người nhận, vd. phương pháp hoặc biến. Vì vậy, để gọi bất kỳ thuộc tính nào bởi một người nhận, thuộc tính đó phải là thành viên của lớp / đối tượng của người nhận đó.
class Mahadi{
val haveCar:String ="BMW"
}
class Johnny{
val haveTv:String = "Sony"
}
val mahadi = new Mahadi
mahadi.haveTv // Error happening
Ở đây mahadi.haveTv sẽ tạo ra một lỗi. Bởi vì trình biên dịch scala đầu tiên sẽ tìm kiếm haveTv tài sản để mahadi nhận. Nó sẽ không tìm thấy. Thứ hai, nó sẽ tìm kiếm một phương thức trong phạm vi có từ khóa ẩn lấy đối tượng Mahadi làm đối số và trả về đối tượng Johnny . Nhưng nó không có ở đây. Vì vậy, nó sẽ tạo ra lỗi . Nhưng sau đây là được.
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
Tiêm tham số ngầm định : Nếu chúng ta gọi một phương thức và không truyền giá trị tham số của nó, nó sẽ gây ra lỗi. Trình biên dịch scala hoạt động như thế này - đầu tiên sẽ cố gắng truyền giá trị, nhưng nó sẽ không nhận được giá trị trực tiếp cho tham số.
def x(a:Int)= a
x // ERROR happening
Thứ hai nếu tham số có bất kỳ từ khoá ngầm nó sẽ tìm kiếm bất kỳ val trong phạm vi mà có cùng loại có giá trị. Nếu không nhận được nó sẽ gây ra lỗi.
def x(implicit a:Int)= a
x // error happening here
Để slove trình biên dịch vấn đề này sẽ tìm một val ẩn có loại Int vì tham số a có từ khóa ẩn .
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.
Một vi dụ khac:
def l(implicit b:Int)
def x(implicit a:Int)= l(a)
chúng ta cũng có thể viết nó như-
def x(implicit a:Int)= l
Bởi vì l có một tham số ngầm định và trong phạm vi của thân phương thức x , nên có một biến cục bộ ẩn ( tham số là biến cục bộ ) a là tham số của x , vì vậy trong phần thân của phương thức x, giá trị đối số ẩn của chữ ký phương thức là nộp bởi các biến x phương pháp của địa phương tiềm ẩn (parameter) a
ngầm .
Vì thế
def x(implicit a:Int)= l
sẽ có trong trình biên dịch như thế này
def x(implicit a:Int)= l(a)
Một vi dụ khac:
def c(implicit k:Int):String = k.toString
def x(a:Int => String):String =a
x{
x => c
}
nó sẽ gây ra lỗi, bởi vì c trong x {x => c} cần truyền giá trị rõ ràng trong đối số hoặc giá trị ẩn trong phạm vi .
Vì vậy, chúng ta có thể làm cho tham số của hàm theo nghĩa rõ ràng ẩn khi chúng ta gọi phương thức x
x{
implicit x => c // the compiler will set the parameter of c like this c(x)
}
Điều này đã được sử dụng trong phương thức hành động của 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())
}
nếu bạn không đề cập đến tham số yêu cầu như ngầm định thì bạn phải viết
def index = Action{
request =>
Ok(views.html.formpage()(request))
}