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