lua里转义字符介绍

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LUA中标示符

Lua中的标识符(Identifiers)可以是任意的数字、字符和下划线“_”,但不能以数字开头。这条规则符合大多数编程语言中的标识符的定义。

字符的具体定义要根据系统的地区设置:任何区域设置可以认同的字母表中的字母都可以用在标识符中。

下面的关键字(keywords)为保留关键字不可以作为标识符出现:

and break do else elseif

end false for function if

in local nil not or

repeat return then true until while

Lua对大小写敏感:and是一个保留字,但是And 和AND 是两个不一样的、但都合法的标识符。习惯上来说,以下划线开始且后面跟着大写字母的标识符(例如_VERSION) 是为Lua内部变量所保留的。

下面的字符(串)是其他的一些标记:

+ - * / ^ =

~= <= >= < > ==

( ) { } [ ]

; : , . .. ...

字符串(Literal strings)以单引号或者双引号定界,同时可以包含以下C语言风格的转义字符:

∙\a --- 铃声(bell)

∙\b --- 回退(backspace)

∙\f --- form feed

∙\n --- 新行(newline)

∙\r --- 回车(carriage return)

∙\t --- 水平制表符(horizontal tab)

∙\v --- 垂直制表符(vertical tab)

∙\\ --- 反斜杠(backslash)

∙\" --- 双引号(quotation mark)

∙\' --- 单引号(apostrophe)

∙\[ --- 左方括号(left square bracket)

∙\] --- 右方括号(right square bracket)

另外,一个`\newline´(一个反斜杠加上一个真正的换行符)会导致字符串内的分行。

字符串中的字符也可以使用转义字符`\ddd´通过数字值来指定。

ddd是最多为3个十进制数字的序列。

Lua中的字符串也可以包含8进制数字,包括嵌入零,它可以表示为`\0´。

字符串也可以用双方括号来定界[[ ···]]。这种括号方式的语法,字符串可以跨越多行,也可以包含嵌套的,同时不会转义任何序列。

方便起见,当开始的`[[´后面紧跟着一个换行符的话,这个换行符不会包括在字符串内。举个例子:在一个使用ASCII编码(其中`a´的编码是97,换行符是10,字符`1´是49)的系统中,以下四种格式得到的都是同一个字符串:

(1) "alo\n123\""

(2) '\97lo\10\04923"'

(3) [[alo

123"]]

(4) [[

alo

123"]]

数值常量(Numerical constants)可以有一个可选的底数部分和一个可选的指数部分。以下是有效的数值常量:

3 3.0 3.1416 314.16e-2 0.31416E1

注释(Comments)可以在任何地方出现,必须在最前面加上双减号(--)。如果紧接着-- 的文本不是[[,那么会认为是一个短注释(short comment),这一行往后到行尾都是注释。否则,会认为是一个常注释(long comment),注释直到相应的]]结束。长注释可以跨越多行,同时可以包含嵌套的[[ ··· ]] 括号对。

为了方便起见,文件的第一行如果是以#开始,这个机制允许Lua在Unix系统中用做一个脚本解释器(见6)。

有时候,我们需要一个增强版的unpack 。我们知道,lua 自带的unpack 可以把一直数组(只有连续数字下标的table)展开成一串返回值,但是对用字符串或别的东西做key 的table 无能为力。

function unpackex(tbl,args)

local ret={}

for _,v in ipairs(args) do

table.insert(ret,tbl[v])

end

return unpack(ret)

end

下面我们可以用这个函数展开一个数组,

print ( unpackex( { one=1,two=2,three=3 }, { "one","two","three" } ))

unpackex 将按第2 个参数表中给出的字符串次序解开第一个参数表。这里我们将看到输出1,2,3 。

btw, 如果你真的需要一个高效的unpackex ,推荐用C 来实现,这样能省掉其中的临时table ret 。

接下来,我们在使用unpackex 时,还有可能遇到一个性能问题。因为第二个参数表通常是个常量数组,但由于lua 的语义,下列函数中的这个常量表,可能在每次进入函数foo 时构造一个新的出来。

function foo(tbl)

return unpackex(tbl,{"one","two","three"})

end

如果foo 对性能很敏感,有经验的lua 程序员或许会这样优化一下:

local const_list={"one","two","three"}

function foo(tbl)

return unpackex(tbl,const_list)

end

但这破坏了代码的直观。如果有了代码模版,我们实际上可以写成这样:

function foo(tbl)

return unpackex(tbl,| {"one","two","three"} |)

end

相关文档
最新文档