Tcl-tk-tcl-namespaces

提供:Dev Guides
移動先:案内検索

Tcl-名前空間

名前空間は、変数とプロシージャをグループ化するために使用される識別子のセットのコンテナです。 名前空間は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