Tcl - เนมสเปซ
เนมสเปซคือคอนเทนเนอร์สำหรับชุดตัวระบุที่ใช้ในการจัดกลุ่มตัวแปรและโพรซีเดอร์ Namespaces พร้อมใช้งานจาก Tcl เวอร์ชัน 8.0 ก่อนการเปิดตัวเนมสเปซมีขอบเขตส่วนกลางเดียว ขณะนี้มีเนมสเปซเรามีพาร์ติชันเพิ่มเติมสำหรับขอบเขตส่วนกลาง
การสร้างเนมสเปซ
เนมสเปซถูกสร้างขึ้นโดยใช้ namespaceคำสั่ง ตัวอย่างง่ายๆสำหรับการสร้างเนมสเปซแสดงไว้ด้านล่าง -
#!/usr/bin/tclsh
namespace eval MyMath {
# Create a variable inside the namespace
variable myResult
}
# Create procedures inside the namespace
proc MyMath::Add {a b } {
set ::MyMath::myResult [expr $a + $b]
}
MyMath::Add 10 23
puts $::MyMath::myResult
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
33
ในโปรแกรมด้านบนคุณจะเห็นว่ามีเนมสเปซพร้อมตัวแปร myResult และขั้นตอน Add. สิ่งนี้ทำให้สามารถสร้างตัวแปรและโพรซีเดอร์ที่มีชื่อเดียวกันภายใต้เนมสเปซที่แตกต่างกัน
เนมสเปซที่ซ้อนกัน
Tcl อนุญาตการซ้อนของเนมสเปซ ตัวอย่างง่ายๆสำหรับการซ้อนเนมสเปซมีดังต่อไปนี้ -
#!/usr/bin/tclsh
namespace eval MyMath {
# Create a variable inside the namespace
variable myResult
}
namespace eval extendedMath {
# Create a variable inside the namespace
namespace eval MyMath {
# Create a variable inside the namespace
variable myResult
}
}
set ::MyMath::myResult "test1"
puts $::MyMath::myResult
set ::extendedMath::MyMath::myResult "test2"
puts $::extendedMath::MyMath::myResult
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
test1
test2
การนำเข้าและส่งออกเนมสเปซ
คุณสามารถดูในตัวอย่างเนมสเปซก่อนหน้านี้เราใช้ตัวดำเนินการแก้ไขขอบเขตจำนวนมากและใช้งานได้ซับซ้อนกว่า เราสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการนำเข้าและส่งออกเนมสเปซ ตัวอย่างได้รับด้านล่าง -
#!/usr/bin/tclsh
namespace eval MyMath {
# Create a variable inside the namespace
variable myResult
namespace export Add
}
# Create procedures inside the namespace
proc MyMath::Add {a b } {
return [expr $a + $b]
}
namespace import MyMath::*
puts [Add 10 30]
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
40
ลืมเนมสเปซ
คุณสามารถลบเนมสเปซที่นำเข้าได้โดยใช้ forgetคำสั่งย่อย ตัวอย่างง่ายๆแสดงไว้ด้านล่าง -
#!/usr/bin/tclsh
namespace eval MyMath {
# Create a variable inside the namespace
variable myResult
namespace export Add
}
# Create procedures inside the namespace
proc MyMath::Add {a b } {
return [expr $a + $b]
}
namespace import MyMath::*
puts [Add 10 30]
namespace forget MyMath::*
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
40