______________________________________________________________________________
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