Manpages

______________________________________________________________________________

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::xa::b::p*。 限 定 的 名 字 包 含 ::並 且 用 一 個 或 多 個 名 字 空 間 的 名 字 限 制 一 個 名 字 。 每 個 pattern 被 一 個 導 出 名 字 空 間 的 名 字 所 限 制 , 並 且 在 限 定 的 名 字 的 結 束 處 可 以 有 通 配 符 式 樣 的 特 殊 字 符 。 通 配 字 符 可 以 不 出 現 在 名 字 空 間 的 名 字 中 。 這 個 命 令 首 先 查 找 匹 配 的 導 出 命 令 。 接 着 檢 查 是 否 有 些 命 令 是 以 前 由 當 前 名 字 空 間 導 入 的 。 如 果 有 , 這 個 命 令 刪 除 相 應 的 導 入 的 命 令 。 效 果 上 , 這 個 命 令 撤 消 namespace import命 令 的 動 作 。
namespace import
?-force? ?pattern pattern ...? 導 入 命 令 到 一 個 名 字 空 間 中 。 所 有 pattern都 是 一 個 限 定 的 命 令 如 foo::xa::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? namename 作 爲 一 個 命 令 或 者 變 量 來 查 找 並 返 回 它 的 完 全 限 定 的 名 字 。 例 如 , 如 果 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 命 令 都 支 持 限 定 的 名 字 。 這 意 味 着 你 可 以 把 限 定 的 名 字 給 這 樣 的 命 令 如 setprocrename、 和 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
如 果 你 頻 繁 使 用 graphtable 命 令 , 你 可 能 希 望 訪 問 它 們 而 不 用 加 Blt::前 綴 。 你 可 以 通 過 把 它 導 入 到 當 前 名 字 空 間 中 的 方 式 來 達 到 此 目 的 。 例 如 :
namespace import Blt::*
這 個 例 子 把 從 Blt名 字 空 間 導 出 的 所 有 命 令 增 加 到 當 前 名 字 空 間 上 下 文 中 , 所 以 你 可 以 象 下 面 這 樣 寫 代 碼 :
graph .g -background red
table . .g 0,0

namespace import命 令 從 一 個 名 字 空 間 導 入 的 命 令 只 能 是 那 個 名 字 空 間 中 用 namespace export命 令 導 出 的 命 令 。 從 一 個 名 字 空 間 導 入 所 有 命 令 一 般 是 一 個 壞 主 意 , 因 爲 你 不 知 道 你 將 會 得 到 些 什 麼 。 更 好 的 方 式 是 隻 導 入 你 需 要 的 命 令 。 例 如 , 命 令

namespace import Blt::graph Blt::table 只 把graphtable 命 令 導 入 到 當 前 上 下 文 。 如 果 你 要 導 入 一 個 已 經 存 在 的 命 令 , 你 將 得 到 一 個 錯 誤 。 這 防 止 你 從 兩 個 不 同 的 包 導 入 同 一 個 命 令 。 但 是 有 的 時 候 (可 能 在 調 試 時 ), 你 可 能 希 望 超 越 這 個 限 制 。 你 可 能 希 望 重 新 發 起 (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!" } } }
過 程bumpreset 被 導 出 , 所 以 當 你 從 Counter 名 字 空 間 導 入 的 時 候 , 它 們 被 包 括 在 內 。 例 如 :
namespace import Counter::*
但 是Check 過 程 未 被 導 出 , 所 以 它 被 導 入 操 作 所 忽 略 。

namespace import, 命 令 只 導 入 被 它 們 的 名 字 空 間 導 出 的 命 令 。 namespace export 命 令 指 定 什 麼 命 令 可 以 被 其 他 名 字 空 間 導 入 。 如 果 一 個 namespace import命 令 指 定 了 一 個 未 被 導 出 的 命 令 , 則 不 導 入 這 個 命 令 。

參 見 SEE ALSO

variable(n)

關 鍵 字 KEYWORDS

exported, internal, variable

[中 文 版 維 護 人 ]

寒 蟬 退 士

[中 文 版 最 新 更 新 ]

2001/10/12

《 中 國 Linux 論 壇 man 手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh

COMMENTS