lua 学习

Chunk

Chunk是一系列语句。交互模式下的每一行都是一个Chunk。一个lua文件也可以是一个Chunk,文件可用dofile导入。

变量

全局变量不需要初始化,未初始化变量的值是nil。删除一个变量只需将其赋值为nil。

局部变量用 local 修饰

注释

单行注释: --
多行注释:

--[[
这里被注释了
--]]

### 命令行执行 lua

lua [options] [script [args]]

-e "command" : 直接用lua解释command
-l : 加载一个文件
-i : 进入交互模式, _PROMPT 是交互模式的提示符

### 基本类型

• nil
• boolean
• number
• string
• userdata
• function
• thread
• tab

函数type可以测试给定变量或值的类型

print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string


---
### 表

lua的表序号是从1算起的,而不是c里的0. 例如
```lua
days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }

print(days[4])

--> Wednesday


赋值语句

lua可以对多个变量同时赋值

a, b = 10, "2*x"
print(a, b)

--> 10 2*x

遇到赋值语句,lua会先计算等号右边所有的值,再执行赋值操作。所以:

x, y = y, x

交换了x, y的值

局部变量

local 创建局部变量,局部变量只在被声明的那个代码块里有效。
do .. end 相当于c中的{},可以包住一块代码,控制local的有效范围。

控制语句

lua认为false和nil为假,其他值为真。

  • if 语句
if conditions then
   then-part
end;

if conditions then
   then-part
else
   else-part
end;

if conditions then
   then-part
elseif confitions then
   elseif-part
..
else
   else-part
end;
  • while 语句
while condition do
   statements;
end;
  • repeat-until
repeat
   statements
until conditions;

- for
数据循环:

for var=exp1, exp2, exp3 do
loop-part
end
三个表达式只会在循环开始前计算一次
控制变量是自动被声明的自动变量,只有循环内有效
循环过程中不要改变控制变量的值。
退出循环使用break

范型循环:

for i, v in ipairs(a) do print(v) end

- break, return
break用来退出当前循环,在循环体外不可使用。
return用来从函数返回结果。函数自然结束时结尾会有一个默认的return。

lua要求break和return只能出现在block的结尾,如chunk的最后一句,end/else/until之前。

---

## 函数

function func_name(arguments-list)
statements-list;
end;

调用函数时,都要在函数名之后加()。当函数只有一个参数,并且这个参数是字符串或者表构造时,调用这个函数可以不加()。例如:

print "Hello World" <--> print("Hello World")
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})


函数调用时实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil替换。

- lua函数可以返回多个值

s, e = string.find("hello lua users", "lua")
print(s, e)

--> 7 9

- 可变参数 ...
lua将参数放在一个叫arg的表中,arg还有一个域n表示参数个数

- 命名参数

rename{old="temp.lua", new="temp1.lua"}


函数名实际上是一个指向函数的变量,函数定义实际上是一个赋值语句,将类型为function的变量赋给一个变量。以下两句是等效的

function foo(x) return 2x end
foo = function(x) return 2
x end


- 闭包


---

全局变量_G中存储了所有全局变量的名字。可以这样打印:

for n in pairs(_G) do print(n) end

posted @ 2014-09-04 16:13  sammei  阅读(321)  评论(0编辑  收藏  举报