Scala - การปิด
ก closure เป็นฟังก์ชันซึ่งค่าส่งกลับขึ้นอยู่กับค่าของตัวแปรหนึ่งตัวหรือมากกว่าที่ประกาศนอกฟังก์ชันนี้
โค้ดต่อไปนี้พร้อมฟังก์ชันไม่ระบุตัวตน
val multiplier = (i:Int) => i * 10
ที่นี่ตัวแปรเดียวที่ใช้ในเนื้อฟังก์ชั่นคือ i * 10 คือ i ซึ่งกำหนดเป็นพารามิเตอร์ของฟังก์ชัน ลองใช้รหัสต่อไปนี้ -
val multiplier = (i:Int) => i * factor
ตัวคูณมีสองตัวแปรฟรี: i และ factor. หนึ่งในนั้นคือ i เป็นพารามิเตอร์ที่เป็นทางการของฟังก์ชัน ดังนั้นจึงถูกผูกไว้กับค่าใหม่ทุกครั้งที่มีการเรียกตัวคูณ อย่างไรก็ตามfactorไม่ใช่พารามิเตอร์ที่เป็นทางการแล้วนี่คืออะไร? ให้เราเพิ่มโค้ดอีกหนึ่งบรรทัด
var factor = 3
val multiplier = (i:Int) => i * factor
ตอนนี้ factorมีการอ้างอิงถึงตัวแปรนอกฟังก์ชัน แต่อยู่ในขอบเขตการปิดล้อม การอ้างอิงฟังก์ชันfactorและอ่านค่าปัจจุบันทุกครั้ง หากฟังก์ชันไม่มีการอ้างอิงภายนอกฟังก์ชันนั้นจะถูกปิดลงเล็กน้อย ไม่จำเป็นต้องมีบริบทภายนอก
ลองใช้โปรแกรมตัวอย่างต่อไปนี้
ตัวอย่าง
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
บันทึกโปรแกรมข้างต้นใน Demo.scala. คำสั่งต่อไปนี้ใช้เพื่อคอมไพล์และรันโปรแกรมนี้
คำสั่ง
\>scalac Demo.scala
\>scala Demo
เอาต์พุต
multiplier(1) value = 3
multiplier(2) value = 6