TCL名字空间.doc

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TCL名字空间

TCL名称空间(namespace) 名称空间是命令和变量的集合。它封装命令和变量以确保不与其它名称空间中的命令和变量冲突。Tcl总是有一个这样的集合,称为全局名称空间。全局名称空间保存全局变量和命令。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命令不时地构建名称空间的内容。例如,下列一系列的命令与上面定义的名称空间的效果相同: 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 } 注意,过程test是被添加到名称空间Counter中的,而稍后通过rename命令删除它。 ? 名称空间中可以包含有其他的名称空间,所以它们是分层嵌套的。嵌套的名称空间被包裹在父名称空间中,而不能与其它名称空间有冲突。 ? 限定的命名 每个名称空间都有一个textual(文本上的)名字,如history或::safe::interp。因为名称空间可以嵌套,使用限定的名字来引用包含在名称空间中的命令,变量和子名称空间。限定的名字类似于Unix文件或Tk组件的分层路径名,除了使用::而不是使用/或.作为分隔符之外。最顶层的或全局名称空间的名字为(空字符串),它的同义词为::。例如,名字::safe::interp::create引用名称空间interp中的命令create,而interp是名称空间::safe的子名称空间,而::safe又是全局名称空间::的子名称空间。 ? ? 如果想要访问另一个名称空间的命令和变量,必须使用一些额外的语法。这些命令或变量的名字必须用包含这些命令或变量的名称空间限定。从全局名称空间中,可以像下列那样访问Counter过程: Counter::bump 5 Counter::Reset 可以像这样访问当前的计数: puts count = $Counter::num 当一个名称空间包含另一个名称空间时,则需要更多的限定的符以访问所需的元素。如果名称空间Foo包含名称空间Counter,要从全局名称空间中调用Counter的bump过程,如下所示: Foo::Counter::bump 3 当创建或重命名命令时,也可以使用限定的名字。例如,可以在名称空间Foo中添加一个过程: proc Foo::Test {args} {return $args} 也可以把同一个过程从一个名称空间中移动另一个名称空间中: rename Foo::Test Bar::Test ? 名称空间的名字不能为空,全局名称空间除外。在简单的命令,变量和名称空间的名字中不允许出现::,除了它作为名称空间分隔符之外。在限定的名字的任意分隔符中,额外的冒号会被忽略,比如,两个或多个冒号被为是一个名称空间分隔符。在限定的变量或命令名字后面尾随的::,表示引用的变量或命令的名字为{}。然而,限定的名称空间名字后面尾随的::,则被忽略。 ? 名称解析 一般来说,所有的Tcl命令和变量的名字都支持限定的名字。意思即是,可以给set,pro,rename和interp alias这些命令一个限定的名字。如果提供一个以::开始的完全限定的名字,对所想要使用的命令,变量或名字空间没有影响。然而,如果名字不是以::开始的(即是相对的),则查找这些名字时Tcl遵守基本的规则:变量名总是首先在当前名称空间中查找,然后再在全局名称空间中查找。命令名总是首先在当前名称空间中查找。如果在当前名称空间中没有查找到,则在每个名称空间中在当前名称空间的路径(默认为空)中查找。如果也

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档