推荐一个快速学习LUA的网站 ,这个网站的内容写的短有些细节忽略了。有时间最好还是要看下面推荐的书 推荐书籍 Programming in Lua third edition.pdf
这个可以放到最后看
我在桌面新建了一个 a.lua 脚本 , 第一行代码是让这个脚本去寻找解释器
#!/usr/local/bin/lua
print("hello world");
因为权限问题 我先给脚本授权,然后直接调用了这个脚本
keyle@keyles-MacBook-Pro ~/Desktop chmod a+x /Users/keyle/Desktop/a.lua
keyle@keyles-MacBook-Pro ~/Desktop ./a.lua
hello world
and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while
nil、boolean、number、string、userdata、function、thread和table
最后一个输出结果 type(nil) 之后 得到了一个 string。
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
使用nil 可以删除table里面的key-value
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
print("")
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
key1 - val1
已经被删除了。在table里如果默认没有声明 key ,则默认从1开始自增
1 - val3
key1 - val1
key2 - val2
1 - val3
key2 - val2
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真” 在其他语言也是如此
Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)
字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示”一块”字符串。
在lua里使用#
来计算字符串长度。
print(#"123")
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
在 Lua 里表的默认初始索引一般以 1 开始。
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}
for i,v in ipairs(tbl2) do
print(i,v)
end
输出结果:
⚙ keyle@keyles-MacBook-Pro ~/Desktop ./a.lua
1 apple
2 pear
3 orange
4 grape
local tb = {[1] = "1",[2] = "2",[20] = "20"}
print(#tb) -- 2
print(tb[20]) -- 20
注意看上面dictionary表中索引如果中断,是无法正确获取table长度的。 解决办法:用keyValue paire去做累计计数,获取正确的长度。
tb1 = {3,3,2,1}
print(table.remove(tb1, 1))--3
支持多个返回值,比如string.find,其返回匹配串”开始和结束的下标”(如果不存在匹配串返回nil)。 举个例子:返回字符串的开始|结束下表
s, e = string.find("just test for you", "test")
print(s, e)
--测试函数的多个返回值
func1 = function()
return "keyle","666"
end
print(func1())
6 9
keyle 666
lua支持不固定参数的传入
func1 = function(...)
local args = {...}
local result = 0
for i=1,#args do
result = result + args[i]
end
return result,#args
end
print(func1(1,2,3,4,5))
-- 返回结果 15 5
lua使用的是协程(coroutine) 与 unity3d的机制几乎一样。这个也好理解。
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。ulua就是通过扩展userdata来实现调用unity3d的各种属性。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。 尽可能使用局部变量,因为访问速度快
do
local a = 123
print(a)
end
--超出了作用域 print -> nil
print(a)
简单形象的赋值方式,第二第三两行是交换两个变量的值。免去写交换算法了
a, b = 10, 2 * x --> a=10; b=2*x
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
左右两边要对称,如果不对称参看下文
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略
这里直接使用 [table].key 的方式取出了 “321”
a = {3,2,1,9}
a["key"] = "321"
print(a.key)
print(a[1])
print(a[4])
print("-----")
for i,v in ipairs(a) do
print(i,v)
end
控制台输出 :
321
3
9
-----
1 3
2 2
3 1
4 9
其他的方式类似 for while所有一样都一样,下面这个do while循环这里取个例子
repeat
statements
until( condition )
输出1 – 10
i = 1
while true
do
if(i>10) then
break
end
print(i)
i=i+1
end
#
用来计算字符或者table长度