______________________________________________________________________________
NAME
namespace - 建 立 及 操 作 給 命 令 和 變 量 的 上 下 文
總 覽 SYNOPSIS
namespace ?option? ?arg ...? _________________________________________________________________
描 述 DESCRIPTION
namespace
命 令 讓 你 建 立
、 訪 問 、 和 銷
燬 給 命 令 和 變
量 的 獨 立 的 上
下 文 。 名 字 空
間 的 概 述 參 見
下 面 的 WHAT IS A NAMESPACE?
(什 麼 是 名 字 空
間 ) 章 節 。 下 面
列 出 了 合 法 的
option 。 注 意 你 可
以 縮 寫 這 些 option
。
namespace children ?namespace? ?pattern?
返 回 屬 於 名 字
空 間 namespace 的 所
有 子 名 字 空 間
的 一 個 列 表 。
如 果 未 指 定
namespace, 則 返 回 當
前 名 字 空 間 的
所 有 子 名 字 空
間 。 這 個 命 令
返 回 完 全 限 制
的 (fully-qualified)的 名 字
, 它 們 以 :: 開
始 。 如 果 給 出
了 可 選 的 pattern ,
則 這 個 命 令 只
返 回 匹 配 通 配
符 式 樣 模 式 的
名 字 。 確 定 實
際 使 用 的 模 式
如 下 : 以 :: 開 始
的 模 式 直 接 使
用 , 否 則 把 命
令 空 間 namespace (或
當 前 名 字 空 間
的 完 全 限 制 的
名 字 ) 加 在 這 個
模 式 的 前 面 。
namespace code script 爲 以 後
執 行 腳 本 script 而
捕 獲 (Capture)當 前 的
名 字 空 間 上 下
文 。 它 返 回 一
個 新 腳 本 , 在
這 個 結 果 腳 本
中 script 被 包 裹 在
一 個 namespace inscope 命 令
中 。 新 腳 本 有
兩 個 重 要 的 特
性 。 首 先 , 它
可 以 在 任 何 名
字 空 間 中 被 求
值 , 而 導 致 script
在 當 前 的 名 字
空 間 (調 用 namespace
code命 令 的 那 個
名 字 空 間 )中 被
求 值 。 其 次 ,
可 以 向 結 果 腳
本 添 加 補 充 的
參 數 並 且 它 們
將 被 作 爲 補 充
參 數 而 傳 遞 給
script 。 例 如 , 假
設 在 名 字 空 間
::a::b 中 調 用 命 令
set script [namespace code {foo bar}]。
則 可 以 在 任 何
名 字 空 間 中 執
行 eval "$script x y" (假
定 script 的 值 已 經
被 正 確 的 傳 遞
進 來 ) 而 與 命 令
namespace eval ::a::b {foo bar x y} 有 相
同 的 效 果 。 這
個 命 令 是 必 須
有 的 , 因 爲 象 Tk
這 樣 的 擴 展 一
般 在 全 局 名 字
空 間 中 執 行 回
調 腳 本 。 一 個
有 作 用 域 的
(scoped)命 令 把 一 個
命 令 和 它 的 名
字 空 間 上 下 文
一 起 捕 獲 , 在
這 種 方 式 下 就
能 在 以 後 正 確
的 執 行 它 。 如
何 使 用 這 個 命
令 建 立 回 調 腳
本 的 例 子 參 見
SCOPED VALUES (有 作 用 域
的 值 )章 節 。
namespace current 返 回 給 當
前 名 字 空 間 的
完 全 限 定 的 名
字 。 全 局 名 字
空 間 的 實 際 的
名 字 是 “”(一 個
空 串 ), 但 這 個
命 令 爲 了 編 程
者 的 方 便 而 爲
全 局 名 字 空 間
返 回 ::。
namespace delete ?namespace namespace ...?
刪 除 所 有 的 名
字 空 間 namespace 和
這 些 名 字 空 間
包 含 的 所 有 變
量 、 過 程 、 和
子 名 字 空 間 。
如 果 在 名 字 空
間 中 一 個 過 程
正 在 執 行 , 在
這 個 過 程 返 回
之 前 這 個 過 程
保 持 存 在 ; 但
是 , 會 標 記 這
個 名 字 空 間 來
防 止 其 他 代 碼
通 過 名 字 查 找
它 。 如 果 一 個
名 字 空 間 不 存
在 , 這 個 命 令
返 回 一 個 錯 誤
。 如 果 未 給 出
名 字 空 間 名 字
, 這 個 命 令 什
麼 也 不 做 。
namespace eval namespace arg ?arg ...?
激 活 叫 namespace 的
名 字 空 間 並 在
這 個 上 下 文 中
對 某 些 腳 本 進
行 求 值 。 如 果
這 個 名 字 空 間
不 存 在 , 則 建
立 它 。 如 果 指
定 了 多 於 一 個
arg 參 數 , 則 用
與 eval命 令 一 樣
的 方 式 把 這 些
參 數 串 聯 起 來
並 用 空 格 彼 此
分 隔 , 並 對 結
果 進 行 求 值 。
如 果 namespace 有 前
導 的 名 字 空 間
限 定 符 並 且 有
的 前 導 名 字 空
間 不 存 在 , 則
自 動 建 立 它 們
。
namespace export ?-clear? ?pattern pattern
...? 指 定 從 一 個
名 字 空 間 中 導
出 那 些 命 令 。
導 出 的 那 些 命
令 以 後 可 以 被
其 他 名 字 空 間
用 namespace import 命 令 導
入 。 在 一 個 名
字 空 間 中 定 義
的 命 令 和 這 個
名 字 空 間 以 前
導 入 的 命 令 二
者 都 可 以 被 這
個 名 字 空 間 導
出 。 在 執 行 namespace
export 命 令 的 時 候
, 這 些 (要 導 出
的 )命 令 不 是 必
須 已 經 被 定 義
了 。 每 個 pattern 可
以 包 含 通 配 符
式 樣 的 特 殊 字
符 , 但 不 可 以
包 含 任 何 名 字
空 間 限 定 符 。
就 是 說 , 模 式
只 能 指 定 在 當
前 (導 出 )的 名 字
空 間 中 的 命 令
。 把 所 有 pattern 添
加 到 這 個 名 字
空 間 的 導 出 模
式 列 表 上 。 如
果 給 出 了 -clear 標
誌 , 則 在 添 加
任 何 pattern 參 數 之
前 , 重 置 這 個
名 字 空 間 的 導
出 模 式 列 表 爲
空 。 如 果 未 給
出 patterns 並 且 未 給
出 -clear標 誌 , 這
個 命 令 返 回 這
個 名 字 空 間 當
前 的 導 出 列 表
。
namespace forget ?pattern pattern ...? 刪
除 以 前 從 一 個
名 字 空 間 導 入
的 命 令 。 所 有
pattern 都 是 一 個 限
定 的 命 令 如 foo::x
或 a::b::p*。 限 定 的
名 字 包 含 ::並
且 用 一 個 或 多
個 名 字 空 間 的
名 字 限 制 一 個
名 字 。 每 個 pattern
被 一 個 導 出 名
字 空 間 的 名 字
所 限 制 , 並 且
在 限 定 的 名 字
的 結 束 處 可 以
有 通 配 符 式 樣
的 特 殊 字 符 。
通 配 字 符 可 以
不 出 現 在 名 字
空 間 的 名 字 中
。 這 個 命 令 首
先 查 找 匹 配 的
導 出 命 令 。 接
着 檢 查 是 否 有
些 命 令 是 以 前
由 當 前 名 字 空
間 導 入 的 。 如
果 有 , 這 個 命
令 刪 除 相 應 的
導 入 的 命 令 。
效 果 上 , 這 個
命 令 撤 消 namespace
import命 令 的 動 作
。
namespace import ?-force? ?pattern pattern
...? 導 入 命 令 到
一 個 名 字 空 間
中 。 所 有 pattern都
是 一 個 限 定 的
命 令 如 foo::x 或
a::p*。 就 是 說 ,
它 包 括 一 個 導
出 名 字 空 間 的
名 字 , 並 且 在
限 定 的 名 字 的
結 束 處 可 以 有
通 配 符 式 樣 的
特 殊 字 符 。 通
配 字 符 可 以 不
出 現 在 名 字 空
間 的 名 字 中 。
把 所 有 匹 配 某
個 pattern 字 符 串 並
且 被 它 們 的 名
字 空 間 導 出 的
命 令 添 加 到 當
前 名 字 空 間 中
。 這 是 通 過 在
當 前 名 字 空 間
中 建 立 一 個 新
命 令 , 這 個 新
命 令 指 向 在 它
的 原 始 名 字 空
間 中 的 導 出 命
令 ; 當 調 用 這
個 新 導 入 的 命
令 的 時 候 , 它
調 用 那 個 導 出
的 命 令 。 如 果
一 個 導 入 的 命
令 與 一 個 現 存
的 命 令 有 衝 突
, 則 這 個 命 令
通 常 返 回 一 個
錯 誤 。 但 是 ,
如 果 給 出 了 -force
選 項 , 在 則 導
入 命 令 將 悄 無
聲 息 的 替 換 現
存 的 命 令 。 namespace
import 命 令 有 當 前
快 照 (snapshot)語 義 : 就
是 說 , 在 要 求
(導 入 )的 命 令 中
, 只 導 入 在 導
出 的 名 字 空 間
中 定 義 了 的 那
些 命 令 。 換 句
話 說 , 你 只 能
導 入 在 執 行 namespace
import 的 時 候 在 一
個 名 字 空 間 中
(已 經 存 在 )的 命
令 。 如 果 此 後
又 定 義 並 導 出
了 其 他 命 令 ,
則 不 會 導 入 它
們 。
namespace inscope namespace arg ?arg ...?
在 一 個 特 定 的
名 字 空 間 的 上
下 文 中 執 行 一
個 腳 本 。 不 希
望 編 程 者 直 接
執 行 這 個 命 令
; 例 如 , 在 應
用 使 用 namespace code命
令 建 立 回 調 腳
本 , 並 且 應 用
接 着 要 向 Tk組 件
註 冊 它 的 時 候
, 隱 式 的 生 成
對 它 的 調 用 。
除 了 有 lappend語 義
並 且 名 字 空 間
必 須 已 經 存 在
之 外 , namespace inscope命
令 與 namespace eval 命 令
非 常 相 似 。 它
把 第 一 個 參 數
作 爲 一 個 列 表
來 對 待 , 接 着
把 後 面 的 所 有
參 數 作 爲 適 當
的 列 表 元 素 添
加 到 第 一 個 參
數 的 尾 部 。 namespace
inscope ::foo a x y z 等 價 於
namespace eval ::foo [concat a [list x y z]]。
這 個 lappend>語 義
很 重 要 , 因 爲
許 多 回 調 腳 本
實 際 上 是 前 綴
。
namespace origin command 返 回
導 入 的 命 令
command所 引 用 的 原
始 命 令 的 完 全
限 定 的 名 字 。
當 一 個 命 令 被
導 入 一 個 名 字
空 間 的 時 候 ,
在 這 個 名 字 空
間 中 建 立 一 個
新 命 令 , 它 指
向 在 導 出 名 字
空 間 中 的 實 際
命 令 。 如 果 一
個 命 令 被 導 入
到 一 個 名 字 空
間 的 序 列 a, b,...,n
之 中 , 這 裏 每
一 個 後 續 的 名
字 空 間 只 從 前
面 的 名 字 空 間
中 導 入 命 令 ,
這 個 命 令 返 回
在 第 一 個 名 字
空 間 中 的 原 始
命 令 的 完 全 限
定 的 名 字 a。
如 果 command不 引 用
一 個 導 入 的 命
令 , 返 回 這 個
(command)命 令 自 己 的
完 全 限 定 的 名
字 。
namespace parent ?namespace? 返 回
給 名 字 空 間
namespace 的 父 名 字
空 間 的 完 全 限
定 的 名 字 。 如
果 未 指 定 namespace,
返 回 當 前 名 字
空 間 的 父 名 字
空 間 的 完 全 限
定 的 命 令 。
namespace qualifiers string 返 回
給 string 的 所 有 前
導 的 名 字 空 間
限 定 符 。 限 定
符 是 由 ::分 隔
的 名 字 空 間 的
名 字 。 對 於 string
::foo::bar::x, 這 個 命
令 返 回 ::foo::bar,
而 對 於 ::它 返
回 一 個 空 串 。
這 個 命 令 與 namespace
tail 命 令 互 補 。
注 意 , 它 不 檢
查 名 字 空 間 的
名 字 事 實 上 是
否 是 目 前 定 義
的 名 字 空 間 的
名 字 。
namespace tail string 返 回 在
一 個 限 定 的 字
符 串 尾 部 的 簡
單 名 字 。 限 定
符 是 由 ::分 隔
的 名 字 空 間 的
名 字 。 對 於 string
::foo::bar::x, 這 個 命
令 返 回 x, 而
對 於 ::它 返 回
一 個 空 串 。 這
個 命 令 與 namespace
qualifiers命 令 互 補 。
它 不 檢 查 名 字
空 間 的 名 字 事
實 上 是 否 是 目
前 定 義 的 名 字
空 間 的 名 字 。
namespace which ?-command? ?-variable?
name 把 name 作 爲 一
個 命 令 或 者 變
量 來 查 找 並 返
回 它 的 完 全 限
定 的 名 字 。 例
如 , 如 果 name 在
當 前 名 字 空 間
中 不 存 在 但 在
全 局 名 字 空 間
中 存 在 , 這 個
命 令 返 回 在 全
局 名 字 空 間 中
的 一 個 完 全 限
定 的 名 字 。 如
果 這 個 命 令 或
變 量 不 存 在 ,
這 個 命 令 返 回
空 串 。 如 果 變
量 已 經 建 立 但
未 被 定 義 , 比
如 通 過 variable 命 令
或 通 過 在 變 量
上 trace(進 行 追 蹤
), 這 個 命 令 返
回 這 個 變 量 的
完 全 限 定 的 名
字 。 如 果 未 給
出 標 誌 , name被
作 爲 一 個 命 令
的 名 字 。 關 於
名 字 解 析 的 規
則 的 解 釋 請 參
見 下 面 的 NAME RESOLUTION
(名 字 解 析 )章 節
。
什 麼 名 字 空 間 WHAT IS A NAMESPACE?
一 個 名 字 空 間 是 命 令 和 變 量 的 一 個 集 合 (collection)。 它 封 裝 命 令 和 變 量 來 確 保 它 們 不 會 被 其 他 名 字 空 間 中 命 令 和 變 量 所 幹 擾 。 Tcl 總 是 有 一 個 這 樣 的 集 合 , 它 被 引 用 爲 global namespace (全 局 名 字 空 間 )。 全 局 名 字 空 間 持 有 所 有 全 局 變 量 和 命 令 。 namespace eval命 令 讓 你 建 立 一 個 新 的 名 字 空 間 。 例 如 ,
namespace eval Counter {
namespace export bump
variable num 0
proc bump {}
{
variable num
incr num } } 建 立 包 含
變 量 num 和 過 程
bump 的 一 個 新 的
名 字 空 間 。 在
這 個 名 字 空 間
中 的 命 令 和 變
量 獨 立 於 在 同
一 個 程 序 中 的
其 他 命 令 和 變
量 。 例 如 , 如
果 在 全 局 名 字
空 間 中 有 一 個
叫 bump的 命 令 ,
它 不 同 的 於 在
Counter 名 字 空 間 中
的 bump 命 令 。 名
字 空 間 變 量 類
似 於 在 Tcl 中 的 全
局 變 量 。 它 們
存 在 於 名 字 空
間 中 的 過 程 之
外 , 但 象 在 上
面 的 例 子 中 展
示 的 那 樣 , 在
同 一 個 名 字 空
間 中 的 過 程 可
以 通 過 variable 命 令
訪 問 它 。 名 字
空 間 是 動 態 的
。 你 可 以 在 任
意 時 候 增 加 及
刪 除 命 令 和 變
量 , 所 以 你 可
以 使 用 一 系 列
namespace eval命 令 分 幾
次 (over time)來 建 造 一
個 名 字 空 間 的
內 容 。 例 如 ,
下 面 的 一 系 列
命 令 與 上 面 展
示 的 定 義 有 相
同 的 效 果 :
namespace eval Counter {
variable num 0
proc bump {} {
variable num
return [incr num] } }
namespace eval Counter {
proc test {args} {
return $args } }
namespace eval Counter {
rename test "" } 注 意 在
例 子 中 向 Counter 名
字 空 間 增 加 了
test 過 程 , 後 來
又 用 rename命 令 把
它 刪 除 了 。 在
名 字 空 間 內 可
以 又 其 他 的 名
字 空 間 , 它 們
是 有 層 次 的 嵌
套 。 一 個 嵌 套
的 名 字 空 間 被
封 裝 在 它 的 父
名 字 空 間 中 並
且 不 會 被 其 他
名 字 空 間 所 幹
擾 。
限 定 的 名 字 QUALIFIED NAMES
每 個 名 字 空 間 都 有 一 個 文 本 名 字 比 如 history 或 ::safe::interp。 因 爲 名 字 空 間 可 以 嵌 套 , 使 用 限 定 的 名 字 來 引 用 在 名 字 空 間 中 的 命 令 、 變 量 、 和 包 含 子 名 字 空 間 。 除 了 使 用 ::作 爲 分 隔 符 而 不 是 / 或 . 之 外 , 限 定 的 (qualified)名 字 類 似 於 給 Unix 文 件 或 Tk 組 件 的 有 層 次 的 路 徑 , 最 頂 層 或 全 局 名 字 空 間 擁 有 名 字 “” (一 個 空 串 ), 而 :: 是 它 的 同 義 詞 。 例 如 , 名 字 ::safe::interp::create 引 用 在 名 字 空 間 ::safe 的 子 名 字 空 間 interp 中 的 命 令 create, ::safe 是 全 局 名 字 空 間 :: 的 子 名 字 空 間 。 如 果 你 打 算 從 其 他 的 名 字 空 間 中 訪 問 命 令 和 變 量 , 你 必 須 使 用 額 外 的 語 法 。 名 字 必 須 被 包 含 它 們 的 名 字 空 間 所 限 定 。 例 如 我 們 可 以 象 下 面 這 樣 訪 問 Counter 的 過 程 :
Counter::bump 5
Counter::Reset 我 們 可 以
象 下 面 這 樣 訪
問 當 前 的 count (變 量
的 值 ):
puts "count = $Counter::num" 當 一
個 名 字 空 間 包
含 另 一 個 的 時
候 , 要 到 達 它
的 元 素 你 可 能
需 要 多 於 一 個
的 限 定 符 。 如
果 我 們 有 一 個
名 字 空 間 Foo,
它 包 含 名 字 空
間 Counter, 你 可 以
象 下 面 這 樣 從
全 局 名 字 空 間
調 用 它 的 bump 過
程 :
Foo::Counter::bump 3 你 還 可 以
在 建 立 和 重 命
名 命 令 的 時 候
使 用 限 定 的 名
字 。 例 如 , 你
可 以 象 下 面 這
樣 向Foo增 加 一
個 過 程 :
proc Foo::Test {args} {return $args} 你 可
以 象 下 面 這 樣
把 同 一 個 過 程
移 動 到 另 一 個
名 字 空 間 中 :
rename Foo::Test Bar::Test 我 們 覆
蓋 (cover)剩 下 的 一 些
關 於 限 定 的 名
字 的 要 點 。 除
了 全 局 名 字 空
間 之 外 名 字 空
間 有 非 空 的 名
字 。 除 了 作 爲
名 字 空 間 分 隔
符 , 不 允 許 ::
在 簡 單 命 令 、
變 量 、 和 名 字
空 間 名 字 中 使
用 。 在 限 定 的
名 字 中 忽 略 額
外 的 : ; 就 是
說 , 兩 個 或 更
多 的 : 被 作 爲
一 個 名 字 空 間
分 隔 符 。 在 一
個 限 定 的 變 量
或 命 令 名 字 中
的 尾 隨 的 :: 引
用 叫 做 {} 的 變 量
或 命 令 。 但 是
忽 略 在 一 個 限
定 的 名 字 空 間
名 中 的 尾 隨 的
::。
NAME
一 般 的 , 所 有 接 受 變 量 和 命 令 的 名 字 的 Tcl 命 令 都 支 持 限 定 的 名 字 。 這 意 味 着 你 可 以 把 限 定 的 名 字 給 這 樣 的 命 令 如 set、 proc、 rename、 和 interp alias。 如 果 你 提 供 了 以 :: 開 始 的 一 個 完 全 限 定 的 名 字 , 對 任 何 命 令 、 變 量 、 或 名 字 空 間 多 沒 有 問 題 。 但 是 , 如 果 這 個 名 字 不 以 一 個 :: 開 始 (它 是 相 對 的 ), Tcl 依 據 一 個 固 定 的 規 則 來 查 找 它 : 解 析 命 令 和 變 量 名 字 總 是 首 先 在 當 前 的 名 字 空 間 中 查 找 , 接 着 在 全 局 名 字 空 間 中 查 找 。 另 一 方 面 , 解 析 名 字 空 間 總 是 在 當 前 名 字 空 間 中 查 找 。 在 下 列 例 子 中 ,
set traceLevel 0
namespace eval Debug {
printTrace $traceLevel }
Tcl 在 名 字 空 間 Debug 中 查 找 traceLevel接 着 在 全 局 名 字 空 間 中 查 找 , 它 以 相 同 的 方 式 查 找 命 令 printTrace。 如 果 一 個 變 量 或 命 令 的 名 字 在 這 兩 個 上 下 文 中 都 找 不 到 , 則 這 個 名 字 是 未 定 義 的 。 爲 了 使 這 一 點 絕 對 清 楚 , 考 慮 下 列 例 子 :
set traceLevel 0
namespace eval Foo {
variable traceLevel 3
namespace
eval Debug {
printTrace $traceLevel } } 這 裏Tcl 首
先 在 名 字 空 間
Foo::Debug 中 查 找
traceLevel。 因 爲 在
這 裏 未 找 到 , Tcl
接 着 在 全 局 名
字 空 間 中 查 找
。 在 名 字 解 析
過 程 中 完 全 忽
略 了 變 量
Foo::traceLevel。 你 可 以
使 用 namespace which 命 令
來 清 除 關 於 名
字 解 析 的 任 何
問 題 :
namespace eval Foo::Debug {namespace which -variable
traceLevel} 返 回 ::
traceLevel。 另 一 方 面
, 命 令 ,
namespace eval Foo {namespace which -variable
traceLevel} 返 回 ::Foo::traceLevel.
如 上 面 提 及 的
那 樣 , 查 找 名
字 空 間 名 字 與
變 量 和 命 令 的
名 字 不 同 。 總
是 在 當 前 名 字
空 間 中 解 析 名
字 空 間 名 字 。
這 意 味 除 非 新
名 字 空 間 的 名
字 以 一 個 ::開
始 , 否 則 建 立
一 個 新 名 字 空
間 的 namespace eval 命 令
總 是 建 立 當 前
名 字 空 間 的 一
個 子 名 字 空 間
。
Tcl 對 你 可 以 引 用 的 變 量 、 命 令 、 或 名 字 空 間 沒 有 訪 問 控 制 。 如 果 你 能 提 供 一 個 限 定 的 名 字 來 通 過 名 字 解 析 規 則 解 析 到 一 個 元 素 , 你 就 可 以 訪 問 這 個 元 素 。 你 可 以 通 過 variable 命 令 從 同 一 個 名 字 空 間 中 的 一 個 過 程 中 訪 問 一 個 名 字 空 間 變 量 。 非 常 象 global 命 令 , 它 建 立 到 名 字 空 間 變 量 的 一 個 本 地 連 接 。 如 果 需 要 , 這 個 命 令 還 在 當 前 的 名 字 空 間 中 建 立 這 個 變 量 並 初 始 化 它 。 注 意 : global命 令 只 建 立 到 在 全 局 名 字 空 間 中 的 變 量 的 連 接 。 如 果 你 總 是 使 用 一 個 適 當 的 限 定 的 名 字 來 引 用 名 字 空 間 變 量 , 則 使 用 variable 命 令 不 是 必 須 的 。
導 入 命 令 IMPORTING COMMANDS
名 字 空 間 經 常 用 來 表 示 庫 。 一 些 庫 命 令 使 用 的 如 此 頻 繁 以 至 於 鍵 入 它 們 的 限 定 的 名 字 是 極 其 煩 人 的 。 例 如 , 假 設 在 一 個 包 如 BLT 中 的 所 有 命 令 都 包 含 在 一 個 叫 Blt 的 名 字 空 間 中 。 則 你 可 以 象 下 面 這 樣 訪 問 這 些 命 令 :
Blt::graph .g -background
red
Blt::table . .g 0,0 如 果 你 頻
繁 使 用 graph 和
table 命 令 , 你 可
能 希 望 訪 問 它
們 而 不 用 加
Blt::前 綴 。 你 可
以 通 過 把 它 導
入 到 當 前 名 字
空 間 中 的 方 式
來 達 到 此 目 的
。 例 如 :
namespace import Blt::* 這 個 例
子 把 從 Blt名 字
空 間 導 出 的 所
有 命 令 增 加 到
當 前 名 字 空 間
上 下 文 中 , 所
以 你 可 以 象 下
面 這 樣 寫 代 碼 :
graph .g -background red
table . .g 0,0
namespace import命 令 從 一 個 名 字 空 間 導 入 的 命 令 只 能 是 那 個 名 字 空 間 中 用 namespace export命 令 導 出 的 命 令 。 從 一 個 名 字 空 間 導 入 所 有 命 令 一 般 是 一 個 壞 主 意 , 因 爲 你 不 知 道 你 將 會 得 到 些 什 麼 。 更 好 的 方 式 是 隻 導 入 你 需 要 的 命 令 。 例 如 , 命 令
namespace import Blt::graph
Blt::table 只 把graph 和
table 命 令 導 入 到
當 前 上 下 文 。
如 果 你 要 導 入
一 個 已 經 存 在
的 命 令 , 你 將
得 到 一 個 錯 誤
。 這 防 止 你 從
兩 個 不 同 的 包
導 入 同 一 個 命
令 。 但 是 有 的
時 候 (可 能 在 調
試 時 ), 你 可 能
希 望 超 越 這 個
限 制 。 你 可 能
希 望 重 新 發 起
(reissue) namespace import命 令 來
導 入 (pick up)一 個 新
命 令 , 而 同 名
的 命 令 在 這 個
名 字 空 間 中 已
經 出 現 過 了 。
在 這 種 情 況 下
, 你 可 以 使 用
-force 選 項 , 現 存
命 令 將 悄 無 聲
息 的 被 覆 寫 (overwritten):
namespace import -force Blt::graph Blt::table 如
果 出 於 某 種 原
因 , 你 打 算 停
止 使 用 導 入 的
命 令 , 你 可 以
用 namespace forget 命 令 刪
除 它 們 , 例 如 :
namespace forget Blt::* 它 在 當
前 名 子 空 間 中
查 找 從 Blt 導 入
的 所 有 命 令 ,
如 果 找 到 則 刪
除 它 們 。 否 則
, 它 什 麼 都 不
做 。 此 後 , 訪
問 Blt命 令 必 須
使 用 Blt:: 前 綴 。
當 你 從 導 出 (命
令 的 )名 字 空 間
刪 除 一 個 命 令
的 時 候 , 例 如 :
rename Blt::graph "" 則 從
所 有 導 入 它 的
名 字 空 間 中 自
動 刪 除 這 個 命
令 。
導 出 命 令 EXPORTING COMMANDS
你 可 以 從 一 個 名 字 空 間 中 導 出 命 令 , 例 如 :
namespace eval Counter {
namespace export bump reset
variable Num 0
variable Max 100
proc bump
{{by 1}} {
variable Num
incr Num $by
Check
return $Num }
proc reset {} {
variable Num
set Num 0 }
proc Check {} {
variable Num
variable Max
if {$Num > $Max} {
error "too high!" } } } 過
程bump 和 reset 被 導
出 , 所 以 當 你
從 Counter 名 字 空 間
導 入 的 時 候 ,
它 們 被 包 括 在
內 。 例 如 :
namespace import Counter::* 但
是Check 過 程 未 被
導 出 , 所 以 它
被 導 入 操 作 所
忽 略 。
namespace import, 命 令 只 導 入 被 它 們 的 名 字 空 間 導 出 的 命 令 。 namespace export 命 令 指 定 什 麼 命 令 可 以 被 其 他 名 字 空 間 導 入 。 如 果 一 個 namespace import命 令 指 定 了 一 個 未 被 導 出 的 命 令 , 則 不 導 入 這 個 命 令 。
參 見 SEE ALSO
關 鍵 字 KEYWORDS
exported, internal, variable
[中 文 版 維 護 人 ]
寒 蟬 退 士
[中 文 版 最 新 更 新 ]
2001/10/12
《 中 國 Linux 論 壇 man 手 冊 頁 翻 譯 計 劃 》 :
跋
本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh