C#使用者的lua学习笔记——基础知识篇
虽然我很不愿意使用像lua这样的弱类型语言 但是没有办法
毕竟Unity热更新的主流仍然还是以xlua为首的lua框架
对于C#使用者来说 lua是一门很神奇的语言 没有很多约束的东西
基本类型
注意 lua里所有的变量都不需要声明类型
类似于C# var的感觉 但你连var都不用写
lua中的简单数据类型包括
- nil
- number
- string
- boolean
nil不等同于C#的null xlua也会提到这一点
但它和null的作用是一致的
number则是所有数字类型的概括 包括整型和浮点数
string和boolean就不用强调了 字符串和布尔类型
--a是一个空值 a = nil --a是一个整数 a = 1 --a是一个浮点数 a = 1.2 --a是一个字符串 a = "hello world" a = 'hello world' --单引号和双引号都可以作为字符串的表达 --lua里没有char类型 --a是一个bool类型 a = true a = false print(type(a))
注释里提到了 lua里没有char类型
同时 像上方的代码完全是可以执行的
因为弱类型 代表着你完全不需要考虑任何类型转换
通过type函数 我们可以得到变量的类型
字符串的操作
str = "12345" --输出字符串长度 英文字符占1 中文字符占3 --输出长度5 print(#str) --输出长度6 print(#"中文") --lua也支持转义字符 这里不多讲述 --多行打印 下面两种方法都可以 print("123\n123") str = [[第一行 第二行 第三行 ]] print(str) --字符串拼接 通过.. --不同类型以字符串拼接的话需要用函数 --%d数字 --%a与任何字符拼接 --&s与字符配对 string.format("123%d",45) --其它类型转字符串 a = true print(a) print(tostring(a)) --字符串提供的公共方法 str = "abCdefg" --小写转大写 print(string.upper(str)) --不会改变原字符串 --大写转小写 print(string.lower(str)) --反转字符串 print(string.reverse(str)) --字符串索引查找 string.find(str, "Cde") --返回3 5 头和尾 并不是从0开始计算而是从1开始 --截取字符串 print(string.sub(str,3)) print(string.sub(str,3,4)) --字符串重复 print(string.rep(str, 2)) 把同一个字符串连续拼接n-1次 --字符串修改 print(string.gsub(str, "Cd", "**")) 返回值ab**efg 1 1指重复了1次 --字符转ASCII码 print(string.byte("Lua", 1)) --L的ASCII码 --ASCII码转字符 print(string.char(a))
运算符
没有自增和自减 也没有复合运算符 没有位运算符 也没有三目运算符
某种意义上反而简单了 因为只有+-*/和幂运算^
--字符串可以进行算术运算符操作 会自动转成number --输出124 print("123" + 1) --输出124.4 print("123.4" + 1) --幂运算 print(2 ^ 2) --2的2次方是4
乘除取余 都会保留小数
条件运算符基本一致
但有个很特殊的地方 不等于
- >=
- ==
- <=
- >
- <
- ~=
不等于不同于C# 不是感叹号!而是~来表示否定
逻辑运算符 与和或改用英文表达 and和or
逻辑非不再使用! 而是使用not
检测到符合条件后 逻辑运算符后的内容不会执行
只在必要时才对后面的操作进行求值 被称为“短路求值”原则
print(false and print(3)) --在lua里 只有false和nil会被视为假的条件 --有假则假 当false读取完 就不会执行and后面的内容了
条件分支语句
lua中没有switch语法
--单分支 if a>5 then print("123") end --双分支 if a<5 then print("123") else print("321") end --多分支 if a < 5 then print("123") elseif a == 6 then print("6") end --elseif一定是连着写的
循环语句
--while循环 num = 0; while num < 5 do print(num) num = num + 1 end --do while循环 repeat print(num) num = num + 1 until num > 5 --for语句 --i在这里会默认递增 for i=1, 5 do print(i) end --i每次递增2 for i=1,5,2 do end --i每次递减1 for i=1,5,-1 do end
函数
关于作用域的问题下一篇会再提到 lua的作用域是一个十分特别的存在
lua中所有的函数都以function标识 不必去考虑public private protected的条件修饰
也不需要强调返回值的类型 因为什么都可以装
除此之外还有很重要的一点就是调用一定要写在定义的后面
如果上一个函数用到了之后才声明的一个函数 是会报错的
--无参数无返回值 function F1() print("F1函数") end F1() --调用不能写在声明之前 F2 = function() print("F2函数") end --有点类似C#中的委托和事件 --因为函数本身也是一种数据类型 --有参数 function F3(a) print(a) end F3(1) F3("123") F3(true) F3() --可以不传参数 返回nil F3(1,2,3) --如果传多个参数和函数参数不匹配 只会补nil或者丢弃 --在这里只会返回1 --有返回值 function F4(a) return a end temp = F4("123") print(temp) --多返回值在前面声明多个变量来接取即可 --变量不够不影响 值接取对应位置的返回值 --变量多了也不影响 会直接赋nil function F5(a) return a, "123", true end temp, temp2, temp3 = F5("1") print(temp3) --lua不支持函数重载 默认调用最后一个声明的函数 function F6() print("1") end function F6(str) print(str) end F6() --变长参数 表之后会讲到 这里可以先看看 function F7(…) --变长参数使用 用一个表存起来 再用 arg = {…} for i=1,#arg do print(arg[i]) end end F7(1,2,3,4,5,6) --变长参数的类型没有限制 --函数嵌套 function F8() F9 = function() print(123) end return F9 end f9 = F8() f9()