<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>进化的测试 &#187; Lua</title>
	<atom:link href="http://magustest.com/blog/tag/lua/feed/" rel="self" type="application/rss+xml" />
	<link>http://magustest.com/blog</link>
	<description>软件测试，自动化测试，白盒测试，Python</description>
	<lastBuildDate>Wed, 04 Jan 2012 09:09:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>在Lua中实现简单的StringBuffer</title>
		<link>http://magustest.com/blog/computer/stringbuffer-in-lua/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stringbuffer-in-lua</link>
		<comments>http://magustest.com/blog/computer/stringbuffer-in-lua/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 09:12:08 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=596</guid>
		<description><![CDATA[在Lua中，字符串是一个常量，如果用字符串连接符“..”把2个字符串连接起来，例如first_str = first_str .. second_str，那么原来的first_str和second_str就会作为垃圾等待回收，first_str引用的是一个新的字符串，如果在程序里面有大量的字符串连接操作的话，性能会十分低下。Lua是一个很简洁的语言，他没有StringBuffer的实现，但是其实我们可以动手写一个简单的StringBuffer实现，来避免性能的问题。 首先定义一个叫StringBuffer的table，使得这个StringBuffer被调用的时候看起来像是面向对象的样子 ：） 然后分别定义两个方法append和tostr，实现的原理就是：append用table来保存所有字符串，tostr把保存了字符串的table用concat转成真正的字符串。 StringBuffer = &#123;&#125; StringBuffer.append = function&#40;t, str&#41; if t and str then table.insert&#40;t, str&#41; end end StringBuffer.tostr = function&#40;t&#41; if t then return table.concat&#40;t&#41; end end StringBuffer.new = function&#40;&#41; return &#123;&#125; end 调用的时候大概如下，摘录了一段代码。。。 all_assets = StringBuffer.new&#40;&#41; for asset in ctx:allassets&#40;&#41; do StringBuffer.append&#40;all_assets, asset:id&#40;&#41;&#41; StringBuffer.append&#40;all_assets, ', '&#41; end <a href='http://magustest.com/blog/computer/stringbuffer-in-lua/'>[...]</a>
No related posts.]]></description>
			<content:encoded><![CDATA[<p>在Lua中，字符串是一个常量，如果用字符串连接符“..”把2个字符串连接起来，例如first_str = first_str .. second_str，那么原来的first_str和second_str就会作为垃圾等待回收，first_str引用的是一个新的字符串，如果在程序里面有大量的字符串连接操作的话，性能会十分低下。Lua是一个很简洁的语言，他没有StringBuffer的实现，但是其实我们可以动手写一个简单的StringBuffer实现，来避免性能的问题。</p>
<p>首先定义一个叫StringBuffer的table，使得这个StringBuffer被调用的时候看起来像是面向对象的样子 ：）<br />
然后分别定义两个方法append和tostr，实现的原理就是：append用table来保存所有字符串，tostr把保存了字符串的table用concat转成真正的字符串。</p>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">StringBuffer <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
StringBuffer.append <span style="color: #66cc66;">=</span>  <span style="color: #b1b100;">function</span><span style="color: #66cc66;">&#40;</span>t, str<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">if</span> t <span style="color: #b1b100;">and</span> str <span style="color: #b1b100;">then</span>
    <span style="color: #b1b100;">table.insert</span><span style="color: #66cc66;">&#40;</span>t, str<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
StringBuffer.tostr <span style="color: #66cc66;">=</span>  <span style="color: #b1b100;">function</span><span style="color: #66cc66;">&#40;</span>t<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">if</span> t <span style="color: #b1b100;">then</span>
    <span style="color: #b1b100;">return</span> <span style="color: #b1b100;">table.concat</span><span style="color: #66cc66;">&#40;</span>t<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
StringBuffer.new <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">end</span></pre></div></div>

<p>调用的时候大概如下，摘录了一段代码。。。</p>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">all_assets <span style="color: #66cc66;">=</span> StringBuffer.new<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">for</span> asset <span style="color: #b1b100;">in</span> ctx:allassets<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">do</span>
    StringBuffer.append<span style="color: #66cc66;">&#40;</span>all_assets, asset:id<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    StringBuffer.append<span style="color: #66cc66;">&#40;</span>all_assets, <span style="color: #ff0000;">', '</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
result <span style="color: #66cc66;">=</span> StringBuffer.tostr<span style="color: #66cc66;">&#40;</span>all_assets<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">print</span> <span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>在Lua中实现这样的一个StringBuffer，既可以避免潜在的性能问题，又可以使得代码看起来更加易懂~好了，重构以前的代码去了。。。</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/computer/stringbuffer-in-lua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

