《Lua程序设计[第二版]》第1,2章笔记

第1章 开始

1.1 程序块(chunk)

Lua执行的每段代码,例如一个源代码文件或交互模式中输入的一行代码,都称之为一个“程序块”,一个程序块也就是一连串的语句或命令。

Lua语句之间不需要分隔符,但也可以使用分号来分隔语句,下面4个程序块都合法,并完全等价:

a = 1

b = a * 2

 

a = 1;

b = a * 2;

 

a = 1 b = a * 2

 

a = 1; b = a * 2;

 

1.2 词法规范

Lua中的标识符可以是由任意字母、数字和下划线构成的字符串,但不能以数字开头: K  j _ij  aName  _ABC

需要避免使用以一个下划线开头并跟着一个或多个大写字母(如“_VERSION”)的标识符,Lua将这类标识符保留用作特殊用途。

以下是Lua的保留字,不能将它们用于标识符:

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”却是两个不同的标识符。

Lua用两个减号"--”来注释一行代码,用"--[[”和“]]”注释一段代码。

1.3 全局变量

在Lua中全局变量不需要声明,访问一个未初始化的变量不会引发错误,访问的结果是一个特殊的值nil。如果要删除一个全局变量,只需将其赋值为nil即可。

1.4 解释器程序(thedtand-slone interpreter)

Lua解释器是一个小程序,可以通过它来直接使用Lua。

在交互模式中,若要打印任何表达式的值,可以用等于号开头,后接表达式,如:

> = math.sin(3)

> a = 30

> = a

这个特征有助于将Lua作为一个计算器使用。


第2章 类型与值

2.1 nil(空)

Nil是一种类型,它只有一个值nil,它的主要功能是用于区别其它任何值。Lua将nil用于表示一种“无效值(non-value)”的情况,即没有任何有效值的情况。

2.2 boolean(布尔)

boolean类型有两个可选值:false 和 true。Lua将false和 nil视为“假”,其余所有值都视为“真”,即零和空字符串也视为“真”。

2.3 number(数字)

number类型用于表示实数。下列数字的写法都正确:

4   0.4    4.57e-3    0.3e12   5e+20

2.4 string(字符串)

Lua的字符串通常表示“一个字符序列”。Lua的字符串是不可变的值(immutable values),不可直接修改字符串中的某个字符,而是根据修改要求创建一个新字符串:

      

       a= “one string”
       b= string.gsub(a, “one”, “another”)     --修改字符串的一部分
       print(a)          -- one string
       print(b)          -- another string

Lua的字符串和其他Lua对象(如table或函数等)一样,都是自动内存管理机制所管理的对象。这表示无需担心字符串的分配和释放。Lua能够高效的处理长字符串,在Lua中操作100K或1M的字符串是很常见的。

Lua字符串中的转义序列如表2-1所示:


Lua中一个字符串可以通过一对匹配的单引号或双引号来界定,还可以通过数值来指定字符串中的字符,数值以转义序列“\<ddd>”给出,其中<ddd>是一个至三个十进制数字组成的序列。例如,字符串“alo\n123\””与字符串‘\97lo\10\04923’是相同的。

还能用一对匹配的双方括号来界定一个字符串,以这种形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。若字符串的第一个字符是换行字符,那么Lua会忽略它。例如:

page = [[
<html>
<head>
<title>An HTMLPage</title>
</head>
<body>
<a href="http://www.duosi.net">Lua</a>
</body>
</html>
]]
 
write(page)

在一个字符串上应用算术操作时,Lua会尝试将这个字符串转换成一个数字:

       print(“10”+ 1)      -- 11

在Lua中,“..”是字符串连接操作符,当直接在一个数字后面输入它时,必须用一个空格隔开,不然Lua会将第一个点当做小数点。

调用函数tostring可以将一个数字转换成字符串。

在Lua5.1中,在字符串前放置操作符“#”可以获得该字符串的长度:

      a = “hello”

       print(#a)         -- 5

       print(#”good\0bye”)  -- 8

 

2.5 tatble(表)

table类型实现了“关联数组(associative array)”,该数组不仅可以通过整数来索引它,还可以使用字符串或其他类型的值(除了nil)来索引它。table没有固定大小,可以动态地添加任意数量的元素到一个table中。table是Lua中仅有的数据结构,具有强大的功能。

在Lua中,table既不是“值”也不是“变量”,而是“对象”。可以将其想象成为一种动态分配的对象,程序仅持有一个对它们的引用(或指针)。table的创建是通过“构造表达式(constructor expression)”完成的,最简单的构造表达式就是{}。

a = {}           -- 创建一个table,并将它的引用存储到a
k = "x"
a[k] = 10 -- 新条目,key="x", value=10
a[20] = "great"  -- 新条目,key=20, value="great"
print(a["x"])    -- 10
k = 20
print(a[k])      -- "great"
a["x"] =a["x"] + 1  -- 递增条目"x"
print(a["x"])    -- 11

初学者常会将a.x 和 a[x]搞错,前者表示a[“x”],表示以字符串”x”来索引table,而后者以变量x的值来索引table。

语句print(a[#a]),可打印列表a的最后一个值。“#”可以获得table的大小。

【在交互模式中,我执行语句 a = {}; a[“d”] = 12; print(#a); 时,输出的结果为0,调用table.maxn(a)同样输出0,为什么a的大小为0呢?但是print(a.d)和print(a[“d”])都能输出12。当再输入a[100] = 1; 求a的大小时,为100。】

 

2.6 function(函数)

在Lua中,函数是作为“第一类值”来看待的。这表示函数可以存储在变量中,可以通过参数传递给其它函数,还可以作为其它函数的返回值。Lua所有的标准库都是用C语言写的,标准库中包括对字符串的操作、table的操作、I/O、操作系统的功能调用、数学函数和调试函数。在第5章详细讨论Lua的函数。

 

2.7 userdata(自定义类型)和thread(线程)

由于userdata类型可以将任意的C语言数据存储到Lua变量中。在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。userdata用于表示一种由应用程序或C语言库所创建的新类型,例如标准的I/O库就用userdata来表示文件。在后面的CAPI中详细讨论这种类型。

第9章会解释thread类型,其中将讨论“协同程序(coroutine)”


第3章 … 请看该系列的下一篇

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值