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