C#使用者的lua学习笔记——基础知识篇

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()

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注