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