总结Lua基础语法,与简单运用 这里并不涉及深入内容

推荐一个快速学习LUA的网站 ,这个网站的内容写的短有些细节忽略了。有时间最好还是要看下面推荐的书
推荐书籍 Programming in Lua third edition.pdf

总结一点学习编程语言的技巧

  1. 学习一个新的语言难免会涉及到大量的内置限定词。这时候就需要使用一个合适的开发工具(重要),智能提示可以帮助我们快速输入和记忆这些重要且不好记忆的文法。

  2. 类比之前的语言 总是可以找到大量的特性的,这时候就免去的重复的记忆

关于lua语言一些难搞的概念

这个可以放到最后看

  1. 迭代器

HelloWorld

我在桌面新建了一个 a.lua 脚本 , 第一行代码是让这个脚本去寻找解释器

1
2
#!/usr/local/bin/lua
print("hello world");

因为权限问题 我先给脚本授权,然后直接调用了这个脚本

1
2
3
keyle@keyles-MacBook-Pro  ~/Desktop  chmod a+x /Users/keyle/Desktop/a.lua
keyle@keyles-MacBook-Pro  ~/Desktop  ./a.lua
hello world

保留关键字

1
2
3
4
5
6
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。

1
2
3
4
5
6
7
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的特性

使用nil 可以删除table里面的key-value

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
1 - val3
key1 - val1
key2 - val2

1 - val3
key2 - val2

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真”
在其他语言也是如此

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

string

字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示”一块”字符串。
在lua里使用#来计算字符串长度。

1
print(#"123")

table

  1. Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
  2. 在 Lua 里表的默认初始索引一般以 1 开始。
  3. table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 创建一个空的 table
    local tbl1 = {}

    -- 直接初始表
    local tbl2 = {"apple", "pear", "orange", "grape"}

    for i,v in ipairs(tbl2) do
    print(i,v)
    end
    输出结果:
    1
    2
    3
    4
    5
     ⚙  keyle@keyles-MacBook-Pro  ~/Desktop  ./a.lua
    1 apple
    2 pear
    3 orange
    4 grape

table计数截断

1
2
3
local tb = {[1] = "1",[2] = "2",[20] = "20"}
print(#tb) -- 2
print(tb[20]) -- 20

注意看上面dictionary表中索引如果中断,是无法正确获取table长度的。
解决办法:用keyValue paire去做累计计数,获取正确的长度。

table的remove会返回自身

1
2
tb1 = {3,3,2,1}
print(table.remove(tb1, 1))--3

function

  • 支持作为变量传递
  • 支持以匿名的方式使用
  • 支持多个返回值

多个返回值

支持多个返回值,比如string.find,其返回匹配串”开始和结束的下标”(如果不存在匹配串返回nil)。
举个例子:返回字符串的开始|结束下表

1
2
3
4
5
6
7
8
s, e = string.find("just test for you", "test") 
print(s, e)

--测试函数的多个返回值
func1 = function()
return "keyle","666"
end
print(func1())
1
2
6	9
keyle 666

可变参数

lua支持不固定参数的传入

1
2
3
4
5
6
7
8
9
10
11
12
13
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

thread

lua使用的是协程(coroutine) 与 unity3d的机制几乎一样。 这个也好理解。

userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。ulua就是通过扩展userdata来实现调用unity3d的各种属性。

变量作用域

  • Lua 变量有三种类型:全局变量、局部变量、表中的域。
  • Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
  • 局部变量的作用域为从声明位置开始到所在语句块结束。
  • 变量的默认值均为 nil。
    尽可能使用局部变量,因为访问速度快
    1
    2
    3
    4
    5
    6
    do 
    local a = 123
    print(a)
    end
    --超出了作用域 print -> nil
    print(a)

赋值

简单形象的赋值方式,第二第三两行是交换两个变量的值。免去写交换算法了

1
2
3
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]'

左右两边要对称,如果不对称参看下文

1
2
3
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略

这里直接使用 [table].key 的方式取出了 “321”

1
2
3
4
5
6
7
8
9
10
11
12
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

控制台输出 :

1
2
3
4
5
6
7
8
321
3
9
-----
1 3
2 2
3 1
4 9

循环

其他的方式类似 for while所有一样都一样,下面这个do while循环这里取个例子

1
2
3
repeat
statements
until( condition )

输出1 – 10

1
2
3
4
5
6
7
8
9
i = 1
while true
do
if(i>10) then
break
end
print(i)
i=i+1
end

符号

  1. 不允许类似 a ++ , a/=1 之类的写法
  2. 不允许类似c#里的&&(and)符号,这里需要用 and
  3. 使用 .. 连接字符串 ..
  4. #用来计算字符或者table长度
  5. ~=这是个不等于符