Các nhà toán học có những cách hài hước nhỏ của riêng họ, vì vậy thay vì nói "sau đó chúng ta gọi hàm f
truyền qua nó x
như một tham số" như chúng ta lập trình viên sẽ nói, họ nói về "áp dụng hàm f
cho đối số của nó x
".
Trong toán học và khoa học máy tính, Áp dụng là một hàm áp dụng các hàm cho các đối số.
Wikipedia
apply
phục vụ mục đích thu hẹp khoảng cách giữa các mô hình hướng đối tượng và chức năng trong Scala. Mọi chức năng trong Scala có thể được biểu diễn dưới dạng một đối tượng. Mỗi hàm cũng có một loại OO: ví dụ, một hàm lấy Int
tham số và trả về Int
sẽ có loại OO Function1[Int,Int]
.
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
Vì mọi thứ là một đối tượng trong Scala f
giờ đây có thể được coi là một tham chiếu đến Function1[Int,Int]
đối tượng. Ví dụ: chúng ta có thể gọi toString
phương thức được kế thừa từ Any
đó, điều đó là không thể đối với một hàm thuần túy, bởi vì các hàm không có các phương thức:
f.toString
Hoặc chúng ta có thể định nghĩa một Function1[Int,Int]
đối tượng khác bằng cách gọi compose
phương thức trên f
và nối hai hàm khác nhau lại với nhau:
val f2 = f.compose((x:Int) => x - 1)
Bây giờ nếu chúng ta thực sự muốn thực thi hàm, hoặc như nhà toán học nói "áp dụng một hàm cho các đối số của nó", chúng ta sẽ gọi apply
phương thức trên Function1[Int,Int]
đối tượng:
f2.apply(2)
Viết f.apply(args)
mỗi khi bạn muốn thực thi một hàm được biểu diễn dưới dạng một đối tượng là cách hướng đối tượng, nhưng sẽ thêm rất nhiều lộn xộn vào mã mà không cần thêm nhiều thông tin bổ sung và thật tuyệt khi có thể sử dụng ký hiệu chuẩn hơn, như vậy như f(args)
. Đó là nơi trình biên dịch Scala bước vào và bất cứ khi nào chúng ta có một tham chiếu f
đến một đối tượng hàm và viết f (args)
để áp dụng các đối số cho hàm được biểu diễn, trình biên dịch sẽ âm thầm mở rộng f (args)
cho lệnh gọi phương thức đối tượng f.apply (args)
.
Mọi chức năng trong Scala đều có thể được coi là một đối tượng và nó cũng hoạt động theo cách khác - mọi đối tượng có thể được coi là một chức năng, miễn là nó có apply
phương thức. Các đối tượng như vậy có thể được sử dụng trong ký hiệu chức năng:
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
Có nhiều trường hợp sử dụng khi chúng ta muốn coi một đối tượng là một hàm. Kịch bản phổ biến nhất là một mô hình nhà máy . Thay vì thêm lộn xộn vào mã bằng phương thức nhà máy, chúng ta có thể apply
phản đối một tập hợp các đối số để tạo một thể hiện mới của một lớp liên kết:
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
Vì vậy, apply
phương thức chỉ là một cách tiện dụng để thu hẹp khoảng cách giữa các hàm và đối tượng trong Scala.