首页

/

归档

/

友链

/

Github

/

模拟面试

/

独立黑客

/

资料

/

订阅

/

RSS

/

关于我


Lua Manual 阅读笔记

and break do else elseif end false for function if in local
nil not or repeat return then true until while
> print(_VERSION)
Lua 5.1
+ - * / % ^ # == ~= <= >= < > =
(  ) {  } [  ] ; : , . .. ...
> print('hello\n123')
hello
123
> print([[hello
>> 123]])
hello
123
> print([[
>> hello
>> 123]])
hello
123

type 函数返回数据的类型:

> print(type(1))
number
> print(type("hello"))
string
> print(1 + "2")
3

坑啊...和js一样...我很讨厌这种特性.

var ::= Name 的形式赋值给变量, 默认全局变量, 除非加了 local 关键字, 本地变量可以被其作用域内的函数访问到. 第一次赋值前, 变量的默认值为 nil. 全局变量存储在 _env 里.

默认全局变量,又是一个坑.

i = 3
i, a[i] = i+1, 20

执行完之后, a[3] 的值是20, a[4] 不受影响.

local i = 0

for i = 0, 10, 2 do
    print(i)
end
$ luajit test.lua 
0
2
4
6
8
10

只能用来做算术循环.

另一种像 Python:

local names = {"hello", "world"}

for k, v in ipairs(names) do
    print(k, v)
end
$ luajit test.lua 
1   hello
2   world
function f()
    return 1, 2, 3
end

local a
local b
local c
f()
print(a, b, c)

a, b, c = f(), 4, 5
print(a, b, c)

a, b, c = f()
print(a, b, c)

a, b, c = 9, 8, f()
print(a, b, c)
$ luajit t.lua 
nil nil nil
1   4   5
1   2   3
9   8   1
> print("hello" .. 1)
hello1
local a = {1, 2, 3, nil, 4}

print(#a)
$ luajit t.lua 
3

坑啊,table支持空洞额...

lua中每个值都有metatable,其中的key称为events,值称为metamethods. 每个events 的名字都是两个下划线开头,例如 __add。主要包括以下方法:

- add +
- sub -
- mul *
- div /
- mod %
- pow ^
- unm -负号
- concat .. 字符连接号
- len # 号
- eq `==`
- lt &lt;
- le &lt;=
- index `table[key]`
- newindex `table[key] = value`
- call

此外,thread,function和userdata这三种类型的对象还有一个table与之相关,叫做 encironment。thread的环境变量在thread内共享,userdata和c函数在c函数内共享。 非嵌套lua函数和创建的thread共享,嵌套的lua函数和嵌套的lua函数共享。

lua thread级别的envrionment table就是全局变量。可以通过 getfenvsetfenv 获取和修改。

local newThread = coroutine.wrap(function()
    print("hello")
    local a = coroutine.yield()
    print(a)
end)

newThread()
newThread("haha")