test = not_define print(test) name, age, sex = "andrew", 18, "male", "蛤丝" -- 最后一个变量会被丢弃, 而不会报错(闷死发大财才是最吼得)
if-else
if-else与python有些像, 不过需要注意if和elseif最后的then和末尾的end
1 2 3 4 5 6 7 8 9 10 11
-- if-else age = 100 if age <= 40 and age >= 20 then print("young man!") elseif age > 40 and age < 100 then print("old man") elseif age < 20 then print("too young") else print("monster") end
-- while num = 0 while num < 10 do print(num) num = num + 1 end
for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- for sum = 0 -- 1表示从1开始, 10表示最大为10(包含10) -- C++: for (int i = 1, i <= 10; ++i) for i = 1, 100 do -- 包含1和100 sum = sum + i end -- 类似于Python中的range操作, 2表示, 每次循环后i执行+2操作 -- C++: for (int i = 1, i <= 10; i = i + 2) for i = 1, 10, 2 do -- 1,3,5,7,9 print(i) sum = sum + i end -- ..操作符用于连接字符串, 可以理解为python中字符串的+ 操作 print("sum = " .. sum)
until循环, 类似于C/C++中的do-while语句
1 2 3 4 5 6 7
-- until(do-while) sum = 2 -- 中文: 直到sum的值大于1000时, 才终止循环 repeat sum = sum ^ 2 -- 幂操作 until sum > 1000 print("do-while, sum = "..sum)
函数
函数在Lua中是一等公民
支持有名和匿名函数
函数最后有个end, 写C/C++/Python的可能不太适应
函数支持一次`返回多个变量
局部函数的定义只需要在函数前加个local, 和局部变量类似
1 2 3 4 5 6 7 8 9 10
-- function(return支持返回多个值), 函数是一等公民 function add(a, b) return a + b end print("1 + 2 = "..add(1, 2)) -- 匿名函数 f = function (a, b) return a * b end print ("匿名函数: " .. f(2, 3))
递归(经典: 斐波那契)
1 2 3 4
function fib(n) if n < 2 then return n end return fib(n - 2) + fib(n - 1) end
-- __add(a, b) for a + b -- __sub(a, b) for a - b -- __mul(a, b) for a * b -- __div(a, b) for a / b -- __mod(a, b) for a % b -- __pow(a, b) for a ^ b -- __unm(a) for -a -- __concat(a, b) for a .. b -- __len(a) for #a -- __eq(a, b) for a == b -- __lt(a, b) for a < b -- __le(a, b) for a <= b -- __index(a, b) <fn or a table> for a.b -- __newindex(a, b, c) for a.b = c -- __call(a, ...) for a(...)
继承
继承同样是通过元表和元方法来实现的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- table实现继承 Dog = {} -- 这个new函数我理解为继承类的构造函数, 冒号(:)函数会使参数默认增加一个self作为参数 function Dog:new() -- 下面这句相当于继承的类增加的新的成员变量 local new_obj = {sound = 'woof'} self.__index = self return setmetatable(new_obj, self) end function Dog:make_sound() -- 等价于Dog.make_sound(Dog) print("say " .. self.sound) end -- 使用 new_dog = Dog:new() -- new_dog获得Dog的方法和变量列表 new_dog:make_sound()