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

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;of&nbsp;a&nbsp;method&nbsp;that&nbsp;you&nbsp;want&nbsp;to&nbsp;invoke&nbsp;on&nbsp;the&nbsp;object.&nbsp;The&nbsp;object&nbsp;has&nbsp;the&nbsp;&nbsp;<BR>same&nbsp;name&nbsp;as&nbsp;its&nbsp;object&nbsp;command.&nbsp;Its&nbsp;data&nbsp;is&nbsp;stored&nbsp;in&nbsp;a&nbsp;global&nbsp;array,&nbsp;&nbsp;<BR>in&nbsp;this&nbsp;case&nbsp;a_color,&nbsp;but&nbsp;that&nbsp;is&nbsp;hidden&nbsp;from&nbsp;the&nbsp;programmer&nbsp;by&nbsp;the&nbsp;&nbsp;<BR>object&nbsp;command.&nbsp;&nbsp;<BR>&nbsp;<BR>We&nbsp;can&nbsp;now&nbsp;create&nbsp;as&nbsp;many&nbsp;objects&nbsp;as&nbsp;we&nbsp;want:&nbsp;just&nbsp;write&nbsp;a&nbsp;procedure&nbsp;&nbsp;<BR>like&nbsp;a1&nbsp;for&nbsp;each&nbsp;object,&nbsp;replacing&nbsp;each&nbsp;occurrence&nbsp;of&nbsp;a1&nbsp;by&nbsp;the&nbsp;name&nbsp;&nbsp;<BR>of&nbsp;another&nbsp;object.&nbsp;Sounds&nbsp;like&nbsp;a&nbsp;lot&nbsp;of&nbsp;work?&nbsp;It&nbsp;is.&nbsp;We&nbsp;will&nbsp;soon&nbsp;see&nbsp;&nbsp;<BR>how&nbsp;you&nbsp;can&nbsp;automate&nbsp;this.&nbsp;Writing&nbsp;a&nbsp;separate&nbsp;procedure&nbsp;for&nbsp;every&nbsp;object&nbsp;<BR>&nbsp;is&nbsp;not&nbsp;only&nbsp;tiresome;&nbsp;it&nbsp;also&nbsp;imposes&nbsp;heavy&nbsp;resource&nbsp;burdens&nbsp;on&nbsp;the&nbsp;&nbsp;<BR>application,&nbsp;because&nbsp;procedures&nbsp;take&nbsp;up&nbsp;space&nbsp;in&nbsp;the&nbsp;TCL&nbsp;interpreter.&nbsp;&nbsp;<BR>&nbsp;<BR>The&nbsp;first&nbsp;improvement&nbsp;is&nbsp;that&nbsp;we&nbsp;can&nbsp;write&nbsp;a&nbsp;single&nbsp;dispatcher&nbsp;procedure&nbsp;<BR>&nbsp;like&nbsp;this&nbsp;one:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example3/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;dispatch&nbsp;{obj_name&nbsp;command&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;get_color&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[get_color&nbsp;$obj_name]&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;set_color&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_color&nbsp;$obj_name&nbsp;[lindex&nbsp;$args&nbsp;0]&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>The&nbsp;object&nbsp;commands&nbsp;can&nbsp;now&nbsp;be&nbsp;written&nbsp;with&nbsp;only&nbsp;a&nbsp;single&nbsp;line&nbsp;of&nbsp;code:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;a1&nbsp;{command&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[eval&nbsp;dispatch&nbsp;a1&nbsp;$command&nbsp;$args]&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>Creating&nbsp;a&nbsp;procedure&nbsp;of&nbsp;this&nbsp;form&nbsp;for&nbsp;each&nbsp;object&nbsp;consumes&nbsp;less&nbsp;memory,&nbsp;<BR>&nbsp;simply&nbsp;because&nbsp;the&nbsp;procedure&nbsp;is&nbsp;shorter.&nbsp;But&nbsp;it&nbsp;is&nbsp;still&nbsp;quite&nbsp;&nbsp;<BR>cumbersome&nbsp;to&nbsp;write&nbsp;a&nbsp;procedure&nbsp;every&nbsp;time&nbsp;you&nbsp;want&nbsp;to&nbsp;instantiate&nbsp;an&nbsp;&nbsp;<BR>object.&nbsp;To&nbsp;simplify&nbsp;this&nbsp;task,&nbsp;we&nbsp;write&nbsp;yet&nbsp;another&nbsp;procedure,&nbsp;one&nbsp;&nbsp;<BR>that&nbsp;creates&nbsp;object&nbsp;commands!&nbsp;It&nbsp;looks&nbsp;like&nbsp;this:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example4/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;apple&nbsp;{args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;name&nbsp;$args&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&quot;return&nbsp;\[eval&nbsp;dispatch&nbsp;$name&nbsp;\$command&nbsp;\$args\]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>We&nbsp;call&nbsp;this&nbsp;procedure&nbsp;the&nbsp;class&nbsp;command,&nbsp;because&nbsp;it&nbsp;is&nbsp;like&nbsp;a&nbsp;class&nbsp;&nbsp;<BR>type&nbsp;that&nbsp;you&nbsp;can&nbsp;instantiate.&nbsp;Instantiating&nbsp;and&nbsp;manipulating&nbsp;objects&nbsp;is&nbsp;<BR>&nbsp;now&nbsp;as&nbsp;simple&nbsp;as&nbsp;this:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;apple&nbsp;a1&nbsp;a2&nbsp;a3&nbsp;<BR>&nbsp;&nbsp;&nbsp;a1&nbsp;set_color&nbsp;green&nbsp;<BR>&nbsp;&nbsp;&nbsp;a2&nbsp;set_color&nbsp;yellow&nbsp;<BR>&nbsp;&nbsp;&nbsp;a3&nbsp;set_color&nbsp;red&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a1&nbsp;has&nbsp;color&nbsp;[a1&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a2&nbsp;has&nbsp;color&nbsp;[a2&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a3&nbsp;has&nbsp;color&nbsp;[a3&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;<BR>The&nbsp;class&nbsp;command&nbsp;creates&nbsp;objects&nbsp;of&nbsp;class&nbsp;'apple'.&nbsp;Each&nbsp;apple&nbsp;has&nbsp;its&nbsp;&nbsp;<BR>own&nbsp;color,&nbsp;which&nbsp;can&nbsp;be&nbsp;accessed&nbsp;through&nbsp;the&nbsp;methods&nbsp;get_color&nbsp;and&nbsp;&nbsp;<BR>set_color&nbsp;of&nbsp;the&nbsp;class.&nbsp;&nbsp;<BR>&nbsp;<BR>There&nbsp;are&nbsp;still&nbsp;some&nbsp;pieces&nbsp;missing&nbsp;in&nbsp;the&nbsp;puzzle.&nbsp;First&nbsp;of&nbsp;all,&nbsp;we&nbsp;&nbsp;<BR>now&nbsp;have&nbsp;a&nbsp;way&nbsp;of&nbsp;creating&nbsp;new&nbsp;objects,&nbsp;but&nbsp;we&nbsp;cannot&nbsp;delete&nbsp;objects&nbsp;&nbsp;<BR>yet.&nbsp;This&nbsp;leads&nbsp;to&nbsp;memory&nbsp;leaks,&nbsp;so&nbsp;we&nbsp;need&nbsp;to&nbsp;provide&nbsp;a&nbsp;procedure&nbsp;for&nbsp;&nbsp;<BR>deleting&nbsp;apples:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example5/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;delete_apple&nbsp;{args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;a_color&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;name&nbsp;$args&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset&nbsp;a_color($name)&nbsp;&nbsp;&nbsp;;&nbsp;#&nbsp;Deletes&nbsp;the&nbsp;object's&nbsp;data&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rename&nbsp;$name&nbsp;{}&nbsp;&nbsp;&nbsp;;&nbsp;#&nbsp;Deletes&nbsp;the&nbsp;object&nbsp;command&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>We&nbsp;can&nbsp;also&nbsp;set&nbsp;up&nbsp;the&nbsp;array&nbsp;a_color&nbsp;in&nbsp;such&nbsp;a&nbsp;way&nbsp;that&nbsp;$a_color(obj)&nbsp;is&nbsp;<BR>&nbsp;always&nbsp;filled&nbsp;in&nbsp;for&nbsp;every&nbsp;object.&nbsp;We&nbsp;do&nbsp;this&nbsp;in&nbsp;the&nbsp;class&nbsp;command:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;apple&nbsp;{args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;name&nbsp;$args&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&quot;return&nbsp;\[eval&nbsp;dispatch&nbsp;$name&nbsp;\$command&nbsp;\$args\]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;a_color($name)&nbsp;green&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>This&nbsp;makes&nbsp;the&nbsp;class&nbsp;command&nbsp;act&nbsp;like&nbsp;a&nbsp;constructor&nbsp;that&nbsp;sets&nbsp;up&nbsp;the&nbsp;&nbsp;<BR>default&nbsp;values&nbsp;for&nbsp;object&nbsp;attributes.&nbsp;In&nbsp;this&nbsp;case&nbsp;we&nbsp;picked&nbsp;green&nbsp;as&nbsp;&nbsp;<BR>the&nbsp;default&nbsp;color.&nbsp;We&nbsp;now&nbsp;use&nbsp;the&nbsp;complete&nbsp;set&nbsp;of&nbsp;procedures&nbsp;like&nbsp;this:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;apple&nbsp;a1&nbsp;a2&nbsp;a3&nbsp;<BR>&nbsp;&nbsp;&nbsp;a2&nbsp;set_color&nbsp;yellow&nbsp;<BR>&nbsp;&nbsp;&nbsp;a3&nbsp;set_color&nbsp;red&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a1&nbsp;has&nbsp;color&nbsp;[a1&nbsp;get_color]&quot;&nbsp;&nbsp;&nbsp;;&nbsp;#&nbsp;Uses&nbsp;default&nbsp;color&nbsp;green&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a2&nbsp;has&nbsp;color&nbsp;[a2&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a3&nbsp;has&nbsp;color&nbsp;[a3&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;delete&nbsp;a1&nbsp;a2&nbsp;a3&nbsp;<BR>&nbsp;<BR>Summary&nbsp;<BR>To&nbsp;summarize,&nbsp;we&nbsp;have&nbsp;followed&nbsp;these&nbsp;steps:&nbsp;&nbsp;<BR>&nbsp;<BR>Store&nbsp;attributes&nbsp;in&nbsp;a&nbsp;global&nbsp;array&nbsp;&nbsp;<BR>Write&nbsp;a&nbsp;procedure&nbsp;for&nbsp;each&nbsp;'method'&nbsp;of&nbsp;the&nbsp;object;&nbsp;this&nbsp;method&nbsp;takes&nbsp;the&nbsp;<BR>&nbsp;name&nbsp;of&nbsp;the&nbsp;object&nbsp;as&nbsp;its&nbsp;first&nbsp;argument.&nbsp;&nbsp;<BR>Write&nbsp;a&nbsp;dispatch&nbsp;procedure&nbsp;to&nbsp;call&nbsp;one&nbsp;of&nbsp;those&nbsp;methods.&nbsp;&nbsp;<BR>For&nbsp;each&nbsp;object,&nbsp;write&nbsp;a&nbsp;procedure&nbsp;(object&nbsp;command)&nbsp;with&nbsp;the&nbsp;same&nbsp;name&nbsp;&nbsp;<BR>as&nbsp;the&nbsp;object.&nbsp;Its&nbsp;first&nbsp;argument&nbsp;is&nbsp;the&nbsp;method&nbsp;name.&nbsp;It&nbsp;calls&nbsp;&nbsp;<BR>'dispatch'.&nbsp;&nbsp;<BR>For&nbsp;each&nbsp;class,&nbsp;write&nbsp;a&nbsp;procedure&nbsp;(class&nbsp;command)&nbsp;that&nbsp;creates&nbsp;the&nbsp;&nbsp;<BR>object&nbsp;commands&nbsp;automatically.&nbsp;The&nbsp;class&nbsp;command&nbsp;can&nbsp;also&nbsp;fill&nbsp;in&nbsp;&nbsp;<BR>default&nbsp;attribute&nbsp;values.&nbsp;&nbsp;<BR>For&nbsp;each&nbsp;class,&nbsp;write&nbsp;a&nbsp;delete&nbsp;procedure&nbsp;to&nbsp;reclaim&nbsp;resources&nbsp;of&nbsp;an&nbsp;&nbsp;<BR>object&nbsp;and&nbsp;destroy&nbsp;its&nbsp;object&nbsp;command.&nbsp;&nbsp;<BR>That's&nbsp;it.&nbsp;You&nbsp;now&nbsp;know&nbsp;enough&nbsp;to&nbsp;start&nbsp;using&nbsp;object&nbsp;commands&nbsp;and&nbsp;&nbsp;<BR>class&nbsp;commands&nbsp;in&nbsp;TCL.&nbsp;The&nbsp;rest&nbsp;of&nbsp;this&nbsp;paper&nbsp;offers&nbsp;a&nbsp;few&nbsp;more&nbsp;tips&nbsp;and&nbsp;<BR>&nbsp;tricks,&nbsp;plus&nbsp;(pointers&nbsp;to)&nbsp;real-life&nbsp;examples&nbsp;where&nbsp;object&nbsp;commands&nbsp;are&nbsp;<BR>&nbsp;used.&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>------------------------------------------------------------------------&nbsp;<BR>--------&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>More&nbsp;attributes&nbsp;<BR>We&nbsp;will&nbsp;give&nbsp;our&nbsp;apple&nbsp;class&nbsp;some&nbsp;more&nbsp;attributes,&nbsp;to&nbsp;show&nbsp;you&nbsp;how&nbsp;&nbsp;<BR>multiple&nbsp;attributes&nbsp;can&nbsp;be&nbsp;handled.&nbsp;We&nbsp;give&nbsp;each&nbsp;apple&nbsp;a&nbsp;size&nbsp;and&nbsp;a&nbsp;&nbsp;<BR>price&nbsp;(both&nbsp;are&nbsp;integers).&nbsp;These&nbsp;are&nbsp;again&nbsp;stored&nbsp;in&nbsp;global&nbsp;arrays,&nbsp;&nbsp;<BR>for&nbsp;example&nbsp;a_size&nbsp;and&nbsp;a_price.&nbsp;Both&nbsp;are&nbsp;indexed&nbsp;by&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;&nbsp;<BR>object,&nbsp;just&nbsp;as&nbsp;for&nbsp;the&nbsp;a_color&nbsp;array&nbsp;we've&nbsp;been&nbsp;using&nbsp;so&nbsp;far.&nbsp;And&nbsp;again&nbsp;<BR>&nbsp;we&nbsp;can&nbsp;write&nbsp;get/set&nbsp;procedures&nbsp;to&nbsp;access&nbsp;these&nbsp;new&nbsp;attributes.&nbsp;The&nbsp;&nbsp;<BR>code&nbsp;is&nbsp;very&nbsp;similar&nbsp;to&nbsp;that&nbsp;for&nbsp;the&nbsp;color&nbsp;attribute,&nbsp;so&nbsp;I&nbsp;will&nbsp;not&nbsp;show&nbsp;<BR>&nbsp;it&nbsp;here.&nbsp;&nbsp;<BR>&nbsp;<BR>An&nbsp;interesting&nbsp;alternative&nbsp;is&nbsp;to&nbsp;use&nbsp;an&nbsp;array&nbsp;for&nbsp;every&nbsp;object,&nbsp;rather&nbsp;&nbsp;<BR>than&nbsp;an&nbsp;array&nbsp;for&nbsp;every&nbsp;attribute.&nbsp;TCL&nbsp;allows&nbsp;us&nbsp;to&nbsp;create&nbsp;a&nbsp;procedure&nbsp;&nbsp;<BR>and&nbsp;an&nbsp;array&nbsp;variable&nbsp;with&nbsp;the&nbsp;same&nbsp;name,&nbsp;so&nbsp;we&nbsp;can&nbsp;call&nbsp;our&nbsp;object&nbsp;&nbsp;<BR>command&nbsp;'a1'&nbsp;and&nbsp;use&nbsp;an&nbsp;array&nbsp;'a1'&nbsp;to&nbsp;store&nbsp;the&nbsp;attributes&nbsp;of&nbsp;that&nbsp;&nbsp;<BR>object.&nbsp;The&nbsp;code&nbsp;of&nbsp;all&nbsp;our&nbsp;procedures&nbsp;now&nbsp;changes&nbsp;slightly:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example6/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;get_color&nbsp;{obj_name}&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;return&nbsp;$arr(color)&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;set_color&nbsp;{obj_name&nbsp;color}&nbsp;{&nbsp;<BR>

⌨️ 快捷键说明

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