นักคณิตศาสตร์มีวิธีตลก ๆ ของตัวเองดังนั้นแทนที่จะพูดว่า "จากนั้นเราเรียกฟังก์ชั่นการf
ส่งผ่านมันx
เป็นพารามิเตอร์" ตามที่เราโปรแกรมเมอร์จะบอกว่าพวกเขาพูดถึง "การใช้ฟังก์ชั่นf
กับอาร์กิวเมนต์x
"
ในวิชาคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์ Apply เป็นฟังก์ชันที่ใช้ฟังก์ชันกับอาร์กิวเมนต์
วิกิพีเดีย
apply
ให้บริการวัตถุประสงค์ของการปิดช่องว่างระหว่างกระบวนทัศน์เชิงวัตถุและเชิงหน้าที่ในสกาล่า ทุกฟังก์ชั่นใน Scala สามารถแสดงเป็นวัตถุได้ ฟังก์ชั่นทุกคนนอกจากนี้ยังมีประเภท OO: ยกตัวอย่างเช่นฟังก์ชั่นที่ใช้เวลาอีกด้วยInt
พารามิเตอร์และส่งกลับจะมีประเภทของInt
OOFunction1[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
เนื่องจากทุกอย่างเป็นวัตถุใน Scala ในf
ขณะนี้จึงสามารถใช้เป็นข้อมูลอ้างอิงกับFunction1[Int,Int]
วัตถุได้ ตัวอย่างเช่นเราสามารถเรียกtoString
ใช้เมธอดที่สืบทอดมาAny
ซึ่งอาจเป็นไปไม่ได้สำหรับฟังก์ชั่นแท้เนื่องจากฟังก์ชั่นไม่มีวิธีการ:
f.toString
หรือเราสามารถกำหนดFunction1[Int,Int]
วัตถุอื่น โดยการเรียกcompose
ใช้เมธอดบนf
และผูกมัดฟังก์ชันที่แตกต่างกันสองฟังก์ชันเข้าด้วยกัน:
val f2 = f.compose((x:Int) => x - 1)
ตอนนี้ถ้าเราต้องการเรียกใช้ฟังก์ชันจริงหรือตามที่นักคณิตศาสตร์บอกว่า "ใช้ฟังก์ชั่นกับอาร์กิวเมนต์" เราจะเรียกใช้apply
เมธอดบนFunction1[Int,Int]
วัตถุ:
f2.apply(2)
การเขียนf.apply(args)
ทุกครั้งที่คุณต้องการใช้งานฟังก์ชั่นที่แสดงเป็นวัตถุนั้นเป็นวิธีที่มุ่งเน้นวัตถุ แต่จะเพิ่มความยุ่งเหยิงจำนวนมากให้กับรหัสโดยไม่ต้องเพิ่มข้อมูลเพิ่มเติมและมันก็ดีที่จะใช้สัญลักษณ์มาตรฐานมากขึ้นเช่น f(args)
ในขณะที่ นั่นคือสิ่งที่ขั้นตอนคอมไพเลอร์สกาล่าและเมื่อใดก็ตามที่เรามีการอ้างอิงf
ไปยังวัตถุที่ฟังก์ชั่นและการเขียนf (args)
เพื่อนำไปใช้การขัดแย้งในการทำงานที่เป็นตัวแทนของคอมไพเลอร์เงียบ ๆ ขยายไปยังวิธีการโทรวัตถุf (args)
f.apply (args)
ทุกฟังก์ชั่นใน Scala สามารถใช้เป็นวัตถุได้และทำงานในลักษณะอื่นเช่นกัน - วัตถุทุกชิ้นสามารถใช้เป็นฟังก์ชันได้หากมีapply
วิธีการ วัตถุดังกล่าวสามารถใช้ในสัญกรณ์ฟังก์ชั่น:
// 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
มีหลายกรณีการใช้งานเมื่อเราต้องการที่จะถือว่าวัตถุเป็นฟังก์ชั่น สถานการณ์ที่พบมากที่สุดคือรูปแบบโรงงาน แทนที่จะเพิ่มความยุ่งเหยิงในรหัสโดยใช้วิธีการจากโรงงานเราสามารถapply
คัดค้านชุดของการขัดแย้งเพื่อสร้างตัวอย่างใหม่ของคลาสที่เกี่ยวข้อง:
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)
ดังนั้นapply
วิธีการจึงเป็นวิธีที่สะดวกในการปิดช่องว่างระหว่างฟังก์ชั่นและวัตถุใน Scala