⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;<BR>The&nbsp;implementation&nbsp;above&nbsp;shows&nbsp;that&nbsp;the&nbsp;procedure&nbsp;makes&nbsp;the&nbsp;objects&nbsp;a1,&nbsp;<BR>&nbsp;a2,&nbsp;a3&nbsp;of&nbsp;class&nbsp;'apple'&nbsp;persistent,&nbsp;by&nbsp;simply&nbsp;outputting&nbsp;a&nbsp;call&nbsp;to&nbsp;&nbsp;<BR>the&nbsp;class&nbsp;command&nbsp;'apple'&nbsp;followed&nbsp;by&nbsp;the&nbsp;object&nbsp;name&nbsp;and&nbsp;all&nbsp;its&nbsp;&nbsp;<BR>attributes.&nbsp;The&nbsp;resulting&nbsp;output&nbsp;is&nbsp;stored&nbsp;in&nbsp;a&nbsp;file&nbsp;and&nbsp;looks&nbsp;like&nbsp;&nbsp;<BR>this:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;apple&nbsp;a1&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-price&nbsp;10&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-size&nbsp;5&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-color&nbsp;green&nbsp;\&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;apple&nbsp;a2&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-price&nbsp;10&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-size&nbsp;3&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-color&nbsp;yellow&nbsp;\&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;apple&nbsp;a3&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-price&nbsp;12&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-size&nbsp;5&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-color&nbsp;red&nbsp;\&nbsp;<BR>&nbsp;<BR>It&nbsp;is&nbsp;now&nbsp;extremely&nbsp;easy&nbsp;to&nbsp;read&nbsp;these&nbsp;persistent&nbsp;objects&nbsp;back&nbsp;from&nbsp;&nbsp;<BR>disk:&nbsp;just&nbsp;source&nbsp;the&nbsp;file!&nbsp;The&nbsp;source&nbsp;command&nbsp;executes&nbsp;all&nbsp;class&nbsp;&nbsp;<BR>commands&nbsp;in&nbsp;the&nbsp;file,&nbsp;creating&nbsp;instances&nbsp;with&nbsp;exactly&nbsp;the&nbsp;same&nbsp;&nbsp;<BR>attributes&nbsp;as&nbsp;the&nbsp;ones&nbsp;we&nbsp;saved&nbsp;earlier.&nbsp;Object&nbsp;persistence&nbsp;in&nbsp;Tcl&nbsp;is&nbsp;&nbsp;<BR>indeed&nbsp;a&nbsp;piece&nbsp;of&nbsp;cake.&nbsp;&nbsp;<BR>&nbsp;<BR>Adding&nbsp;new&nbsp;classes&nbsp;<BR>So&nbsp;far,&nbsp;we&nbsp;have&nbsp;worked&nbsp;with&nbsp;only&nbsp;a&nbsp;single&nbsp;class&nbsp;apple.&nbsp;If&nbsp;we&nbsp;want&nbsp;to&nbsp;add&nbsp;<BR>&nbsp;a&nbsp;new&nbsp;class&nbsp;to&nbsp;our&nbsp;example,&nbsp;we&nbsp;need&nbsp;to&nbsp;write&nbsp;a&nbsp;new&nbsp;class&nbsp;command&nbsp;and&nbsp;&nbsp;<BR>a&nbsp;new&nbsp;dispatcher&nbsp;procedure.&nbsp;&nbsp;<BR>Suppose&nbsp;we&nbsp;also&nbsp;want&nbsp;to&nbsp;have&nbsp;objects&nbsp;of&nbsp;class&nbsp;fridge&nbsp;(in&nbsp;which&nbsp;we&nbsp;will&nbsp;&nbsp;<BR>want&nbsp;to&nbsp;store&nbsp;apples&nbsp;of&nbsp;course).&nbsp;We&nbsp;need&nbsp;to&nbsp;duplicate&nbsp;the&nbsp;effort&nbsp;we&nbsp;&nbsp;<BR>did&nbsp;on&nbsp;the&nbsp;apple&nbsp;class:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example10/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;dispatch_fridge&nbsp;{obj_name&nbsp;command&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;configure&quot;&nbsp;||&nbsp;$command&nbsp;==&nbsp;&quot;config&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;$args&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;cget&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$arr([lindex&nbsp;$args&nbsp;0])&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;open&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$arr(-state)&nbsp;==&nbsp;&quot;open&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Fridge&nbsp;$obj_name&nbsp;already&nbsp;open.&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;arr(-state)&nbsp;&quot;open&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Opening&nbsp;fridge&nbsp;$obj_name...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;close&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$arr(-state)&nbsp;==&nbsp;&quot;closed&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Fridge&nbsp;$obj_name&nbsp;already&nbsp;closed.&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;arr(-state)&nbsp;&quot;closed&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Closing&nbsp;fridge&nbsp;$obj_name...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Error:&nbsp;Unknown&nbsp;command&nbsp;$command&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;fridge&nbsp;{name&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;$name&nbsp;{command&nbsp;args}&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;return&nbsp;\[eval&nbsp;dispatch_fridge&nbsp;$name&nbsp;\$command&nbsp;\$args\]&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;First&nbsp;set&nbsp;some&nbsp;defaults&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;{-state&nbsp;closed&nbsp;-label&nbsp;A}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Then&nbsp;possibly&nbsp;override&nbsp;those&nbsp;defaults&nbsp;with&nbsp;user-supplied&nbsp;&nbsp;<BR>values&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;[llength&nbsp;$args]&nbsp;&gt;&nbsp;0&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;$name&nbsp;configure&nbsp;$args&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>This&nbsp;laborious&nbsp;task&nbsp;can&nbsp;also&nbsp;be&nbsp;partly&nbsp;automated&nbsp;by&nbsp;a&nbsp;procedure&nbsp;called&nbsp;&nbsp;<BR>class&nbsp;which&nbsp;accepts&nbsp;the&nbsp;name&nbsp;of&nbsp;a&nbsp;new&nbsp;class,&nbsp;a&nbsp;list&nbsp;of&nbsp;its&nbsp;member&nbsp;&nbsp;<BR>variables,&nbsp;and&nbsp;a&nbsp;list&nbsp;of&nbsp;its&nbsp;method&nbsp;names.&nbsp;It&nbsp;then&nbsp;automatically&nbsp;sets&nbsp;up&nbsp;<BR>&nbsp;the&nbsp;necessary&nbsp;procedures&nbsp;such&nbsp;as&nbsp;the&nbsp;class&nbsp;command&nbsp;and&nbsp;the&nbsp;dispatcher&nbsp;&nbsp;<BR>proc.&nbsp;The&nbsp;only&nbsp;thing&nbsp;we&nbsp;still&nbsp;need&nbsp;to&nbsp;implement&nbsp;by&nbsp;hand,&nbsp;are&nbsp;the&nbsp;methods&nbsp;<BR>&nbsp;of&nbsp;the&nbsp;class.&nbsp;The&nbsp;whole&nbsp;thing&nbsp;could&nbsp;be&nbsp;set&nbsp;up&nbsp;as&nbsp;follows:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example11/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;class&nbsp;{classname&nbsp;vars&nbsp;methods}&nbsp;{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Create&nbsp;the&nbsp;class&nbsp;command,&nbsp;which&nbsp;will&nbsp;allow&nbsp;new&nbsp;instances&nbsp;to&nbsp;be&nbsp;&nbsp;<BR>created.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;$classname&nbsp;{obj_name&nbsp;args}&nbsp;&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;The&nbsp;class&nbsp;command&nbsp;in&nbsp;turn&nbsp;creates&nbsp;an&nbsp;object&nbsp;command.&nbsp;&nbsp;&nbsp;<BR>Careful&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;with&nbsp;those&nbsp;escape&nbsp;characters!&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;\$obj_name&nbsp;{command&nbsp;args}&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&quot;return&nbsp;\\\[eval&nbsp;dispatch_$classname&nbsp;\$obj_name&nbsp;\\\$command&nbsp;&nbsp;<BR>\\\$args\\\]\&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Set&nbsp;variable&nbsp;defaults&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;\$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;{$vars}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Then&nbsp;possibly&nbsp;override&nbsp;those&nbsp;defaults&nbsp;with&nbsp;user-supplied&nbsp;&nbsp;<BR>values&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;\[llength&nbsp;\$args\]&nbsp;&gt;&nbsp;0&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;\$obj_name&nbsp;configure&nbsp;\$args&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Create&nbsp;the&nbsp;dispatcher,&nbsp;which&nbsp;dispatches&nbsp;to&nbsp;one&nbsp;of&nbsp;the&nbsp;class&nbsp;&nbsp;<BR>methods&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;dispatch_$classname&nbsp;{obj_name&nbsp;command&nbsp;args}&nbsp;&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;\$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;\$command&nbsp;==&nbsp;\&quot;configure\&quot;&nbsp;||&nbsp;\$command&nbsp;==&nbsp;\&quot;config\&quot;&nbsp;}&nbsp;&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;\$args&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;\$command&nbsp;==&nbsp;\&quot;cget\&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\$arr(\[lindex&nbsp;\$args&nbsp;0\])&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;\[lsearch&nbsp;{$methods}&nbsp;\$command\]&nbsp;!=&nbsp;-1&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uplevel&nbsp;1&nbsp;${classname}_\${command}&nbsp;\$obj_name&nbsp;\$args&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;\&quot;Error:&nbsp;Unknown&nbsp;command&nbsp;\$command\&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>The&nbsp;class&nbsp;procedure&nbsp;basically&nbsp;just&nbsp;creates&nbsp;two&nbsp;new&nbsp;commands&nbsp;for&nbsp;us&nbsp;(a&nbsp;&nbsp;<BR>class&nbsp;command&nbsp;and&nbsp;a&nbsp;dispatcher).&nbsp;&nbsp;<BR>&nbsp;<BR>The&nbsp;code&nbsp;looks&nbsp;pretty&nbsp;messy,&nbsp;because&nbsp;it&nbsp;contains&nbsp;two&nbsp;levels&nbsp;of&nbsp;&nbsp;<BR>indirection:&nbsp;a&nbsp;proc&nbsp;that&nbsp;creates&nbsp;a&nbsp;proc&nbsp;that&nbsp;creates&nbsp;yet&nbsp;another&nbsp;proc.&nbsp;&nbsp;<BR>This&nbsp;involves&nbsp;a&nbsp;bit&nbsp;of&nbsp;backslash-escape&nbsp;sourcery,&nbsp;which&nbsp;can&nbsp;be&nbsp;&nbsp;<BR>confusing.&nbsp;Richard&nbsp;Suchenwirth&nbsp;has&nbsp;a&nbsp;very&nbsp;nice&nbsp;solution&nbsp;to&nbsp;make&nbsp;this&nbsp;&nbsp;<BR>kind&nbsp;of&nbsp;proc-creating-proc&nbsp;more&nbsp;readable:&nbsp;he&nbsp;creates&nbsp;a&nbsp;template&nbsp;with&nbsp;&nbsp;<BR>names&nbsp;containing&nbsp;a&nbsp;special&nbsp;character&nbsp;such&nbsp;as&nbsp;the&nbsp;'@'&nbsp;sign;&nbsp;then&nbsp;he&nbsp;&nbsp;<BR>replaces&nbsp;those&nbsp;names&nbsp;by&nbsp;the&nbsp;actual&nbsp;class&nbsp;and&nbsp;instance&nbsp;names,&nbsp;using&nbsp;&nbsp;<BR>regsub.&nbsp;See&nbsp;his&nbsp;page&nbsp;on&nbsp;&gt;&gt;&nbsp;gadgets&nbsp;for&nbsp;an&nbsp;example.&nbsp;Using&nbsp;this&nbsp;technique,&nbsp;<BR>&nbsp;our&nbsp;implementation&nbsp;becomes&nbsp;a&nbsp;lot&nbsp;simpler:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example12/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;class&nbsp;{classname&nbsp;vars&nbsp;methods}&nbsp;{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Create&nbsp;the&nbsp;class&nbsp;command,&nbsp;which&nbsp;will&nbsp;allow&nbsp;new&nbsp;instances&nbsp;to&nbsp;be&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -