﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-码农往事-随笔分类-LUA</title><link>http://www.blogjava.net/rockblue1988/category/54656.html</link><description>我的代码为什么这么丑?一定是因为我长的不好看</description><language>zh-cn</language><lastBuildDate>Tue, 03 Feb 2015 12:17:53 GMT</lastBuildDate><pubDate>Tue, 03 Feb 2015 12:17:53 GMT</pubDate><ttl>60</ttl><item><title>LUA 面向对象编程中的一个坑</title><link>http://www.blogjava.net/rockblue1988/archive/2014/12/29/421910.html</link><dc:creator>Jimi</dc:creator><author>Jimi</author><pubDate>Mon, 29 Dec 2014 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/rockblue1988/archive/2014/12/29/421910.html</guid><wfw:comment>http://www.blogjava.net/rockblue1988/comments/421910.html</wfw:comment><comments>http://www.blogjava.net/rockblue1988/archive/2014/12/29/421910.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/rockblue1988/comments/commentRss/421910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rockblue1988/services/trackbacks/421910.html</trackback:ping><description><![CDATA[最近的工作主要涉及LUA，这有个坑必须记一下。<br />
下面是一个LUA面向对象写法非常常见的写法。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->Bird&nbsp;=&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;{};canFly&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span><br />
}<br />
<br />
function&nbsp;Bird:<span style="color: #0000FF; ">new</span>(o)<br />
&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;=&nbsp;o&nbsp;or&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;setmetatable(o,&nbsp;self)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.__index&nbsp;=&nbsp;self<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.color&nbsp;=&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;o<br />
end</div>
注意，这里Bird类有两个属性，1个表，1个是基本类型，然后上测试代码（Utils类只是简单的封装类，可以自己实现一个）<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp; &nbsp; &nbsp; local&nbsp;A&nbsp;=&nbsp;Bird:<span style="color: #0000FF; ">new</span>()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("------------------------------原始值-----------------------------------");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("Bird&nbsp;canFly:"&nbsp;..&nbsp;StringUtils.boolean2string(A.canFly));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("Bird&nbsp;color:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtils.printTable(Bird.color)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("a&nbsp;canFly:"&nbsp;..&nbsp;StringUtils.boolean2string(A.canFly));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("a&nbsp;color:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtils.printTable(A.color)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--改变A的属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.canFly&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.color[1]&nbsp;=&nbsp;"red"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.color[2]&nbsp;=&nbsp;"blue"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.color[3]&nbsp;=&nbsp;"green"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("------------------------------A改变后----------------------------------");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("Bird&nbsp;canFly:"&nbsp;..&nbsp;StringUtils.boolean2string(Bird.canFly));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("Bird&nbsp;color:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtils.printTable(Bird.color)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("A&nbsp;canFly&nbsp;after&nbsp;change:"&nbsp;..&nbsp;StringUtils.boolean2string(A.canFly));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("A&nbsp;color&nbsp;after&nbsp;chagne:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtils.printTable(A.color)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("-------------------------------B的值----------------------------------");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;B&nbsp;=&nbsp;Bird:<span style="color: #0000FF; ">new</span>()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("B&nbsp;canFly:"&nbsp;..&nbsp;StringUtils.boolean2string(B.canFly));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoggerUtils:debug("B&nbsp;color:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtils.printTable(B.color)</div>
<br />代码执行结果：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2014-12-29&nbsp;11:20:40,690&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;------------------------------原始值-----------------------------------<br />2014-12-29&nbsp;11:20:40,690&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;color:<br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;a&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;a&nbsp;color:<br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;------------------------------A改变后----------------------------------<br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:20:40,691&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;color:<br />2014-12-29&nbsp;11:20:40,692&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;1:red<br />2014-12-29&nbsp;11:20:40,692&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;2:blue<br />2014-12-29&nbsp;11:20:40,692&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;3:green<br />2014-12-29&nbsp;11:20:40,692&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;A&nbsp;canFly&nbsp;after&nbsp;change:<span style="color: #0000FF; ">false</span><br />2014-12-29&nbsp;11:20:40,692&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;A&nbsp;color&nbsp;after&nbsp;chagne:<br />2014-12-29&nbsp;11:20:40,693&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;1:red<br />2014-12-29&nbsp;11:20:40,693&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;2:blue<br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;3:green<br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;-------------------------------B的值----------------------------------<br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;B&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;B&nbsp;color:<br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;1:red<br />2014-12-29&nbsp;11:20:40,695&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;2:blue<br />2014-12-29&nbsp;11:20:40,696&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;3:green</div>发现神马问题了吗？<br />当A的类型为表的属性color改变时，原始类的color属性也改变了，同时这个改变也影响到新建的B，而类型为基本类型的属性canFly就没有这个问题。<br />我的解决方法是新增一个set方法：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->function&nbsp;Bird:setColor(color)<br />&nbsp;&nbsp;&nbsp;&nbsp;self.color&nbsp;=&nbsp;color<br />end</div><br />然后修改改变属性的方式：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->local&nbsp;color&nbsp;={}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color[1]&nbsp;=&nbsp;"red"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color[2]&nbsp;=&nbsp;"blue"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color[3]&nbsp;=&nbsp;"green"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A:setColor(color)</div>输出结果：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2014-12-29&nbsp;11:31:58,648&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;------------------------------原始值-----------------------------------<br />2014-12-29&nbsp;11:31:58,648&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:31:58,649&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;color:<br />2014-12-29&nbsp;11:31:58,649&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;a&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:31:58,649&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;a&nbsp;color:<br />2014-12-29&nbsp;11:31:58,649&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;------------------------------A改变后----------------------------------<br />2014-12-29&nbsp;11:31:58,649&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;Bird&nbsp;color:<br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;A&nbsp;canFly&nbsp;after&nbsp;change:<span style="color: #0000FF; ">false</span><br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;A&nbsp;color&nbsp;after&nbsp;chagne:<br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;1:red<br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;2:blue<br />2014-12-29&nbsp;11:31:58,650&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;3:green<br />2014-12-29&nbsp;11:31:58,651&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;-------------------------------B的值----------------------------------<br />2014-12-29&nbsp;11:31:58,651&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;B&nbsp;canFly:<span style="color: #0000FF; ">true</span><br />2014-12-29&nbsp;11:31:58,653&nbsp;[main]&nbsp;DEBUG&nbsp;server.app.game.util.LoggerUtils:34&nbsp;-&nbsp;LUA:&nbsp;B&nbsp;color:</div>另外同事一个解决方法更简单，直接修改new()方法，其它的地方都不用改：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->function&nbsp;Bird:<span style="color: #0000FF; ">new</span>(o)<br />&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;=&nbsp;o&nbsp;or&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;setmetatable(o,&nbsp;self)<br />&nbsp;&nbsp;&nbsp;&nbsp;self.__index&nbsp;=&nbsp;self<br />&nbsp;&nbsp;&nbsp;<span style="background-color: yellow;">&nbsp;o.color&nbsp;</span><span style="background-color: yellow;">=</span><span style="background-color: yellow;">&nbsp;{}&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;o<br />end</div>这个问题基本上网上的示例貌似都没提到，我读的书里也没有，实际调试过程中才发现的，会造成新创建的类里会有不该有的属性，比较蛋疼。<br />具体原因不了解，有木有筒子指教一下？顺便问问这两种方法哪种更好？<img src ="http://www.blogjava.net/rockblue1988/aggbug/421910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rockblue1988/" target="_blank">Jimi</a> 2014-12-29 11:42 <a href="http://www.blogjava.net/rockblue1988/archive/2014/12/29/421910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>