Trong Scala bạn có thể làm những việc như:Chức năng các thông số ngầm không dùng nữa nên sau khi đi qua nó để một hàm bậc cao
def foo(implicit v: Int) = println(v);
def h(x: Int) = { implicit val i: Int = x; foo }
h(42)
> 42
h
gọi được foo
tham chiếu như một đóng cửa.
Sẽ không lạ để thử qua foo
-h
như một tham số:
def g(x: Int)(f: Int => Unit) = { implicit val i: Int = x; f }
Nhưng nó sẽ không hoạt động:
g(1)(foo)
> error: could not find implicit value for parameter v: Int
Những gì tôi nghĩ rằng nó xảy ra là foo
được được gọi là đánh giá tham số thực tế. Đúng không?
Khi đã thông qua một chức năng với một danh sách tham số bình thường (không ẩn), chức năng không được đánh giá:
def foo2(v: Int) = println("Foo2")
g(1)(foo2)
> Int => Unit = <function1>
Đây là một kết quả mong đợi và foo2
đánh giá không được xét xử như một đánh giá của một thực tế tham số.
Tại sao foo
được đánh giá là thông số thực tế khi không có giá trị ngầm để làm như vậy?
tương tự xảy ra với lệnh gán:
val fooref: Int => Unit = foo
> error: could not find implicit value for parameter v: Int
Nó giống như từ Int => Unit
không phù hợp với một chức năng mà các tham số Int
được đánh dấu là tiềm ẩn, trình biên dịch loại bỏ nó như một tham số thực tế có giá trị và do đó cố gắng để đánh giá nó. Không tìm thấy giá trị ngầm được khai báo để thực hiện cuộc gọi.
Nếu trường hợp đó xảy ra, điều gì sẽ là cách thể hiện loại hàm với thông số ngầm?