当先锋百科网

首页 1 2 3 4 5 6 7

在线调试工具

菜鸟教程

语言

编译语言

  • 先编译在运行
  • 编译过程中会发现问题

脚本语言

  • 不运行看不到问题
  • 功能更新,更新C#,快速修正问题

Lua

  • lua是一种轻量小巧的语言,用标准的C语言编写并以源码形式开放
  • 设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和制定功能

Lua特点

  • 轻量级:标准C语言编写并开放源码,编译后仅一百余K
  • 扩展性,Lua提供了易于使用扩展的接口和机制,由宿主语言(通常是C或者C++)提供一部分功能,Lua可以使用他们,就行是本来就是内置功能一样
  • 使用领域
    • 游戏行业
    • web领域(Nginx)服务器
    • 嵌入式,自动驾驶等
  • 可以与其他语言通讯,C#调用C++,C++调用Lua

基础语法

01输出

print("测试")
print("aabcdefg")
print("xxxxx","第二个参数","第三个参数")

02注释

print("这段代码会运行")
--print("我被注释掉了,所以不会运行")
--[[
    我是多行注释
    不管我写多少行
    都不会影响代码运行
]]

03变量

  • Lua会自动推到类型
  • 只需要给定名称,再给变量值,可以不写分号(写不写都可以)
  • 不能轻易定义全局变量,会容易被修改
--新建三个变量,并赋值
year = "didhaid ada"
month = true
day = 7
--打印出三个变量的值
print(year,month,day)
-- 内置变量
-- 特点:下划线+大写字母
-- 查看Lua版本
print(_VERSION)

-- 调用一个不存在的变量
-- 类型是nil,等同于C#的null
print(id)

-- 销毁一个已经定义的变量
name=nil

-- 全局变量和局部变量
-- data="hsxd"--定义一个全局变量
local data="hsxd"-- 定义一个局部变量(作用域为当前文件)

04数据类型

  • 数字
  • 字符串
  • bool
  • 表Table
local name="Unity"

-- 获得变量类型,type(...)
-- type()是函数结构,一个代码片段,可以重复调用执行,有参数和返回值
print(type(name))

-- 获得type()返回值类型
-- type()返回值类型是string,为空返回"nil"字符串
print(type(type(name)))
print(type(bb)=="nil")

-- 多数据类回归拿到number类型下
print(type(123.5))
print(type(true))
print(type('hxsd'))

05字符串

-- 单行定义
local str1="abc"
print(str1)
local str2="def"
print(str1)

-- 多行定义字符串
-- 完全还原字符串内部的定义结构,如换行符都是存储的
local str3=[[
one
two]]
print(str3)

-- str1+str2 用 ..
print(str1 .. str2)
-- Lua对两个字符串相加时,会自动转换成数字类型
print("1" + "2")

-- 获取字符串长度
print("长度:".. #str1)

06字符串相关函数

-- 字符串大小写写化
print(string.upper("abc"))
print(string.lower("ABC"))

-- 查找
-- 参数被查找的字符串,查找内容
-- 返回值:起始位置和结束位置
-- 下标从1开始,并且多返回值
print(string.find("abcdefg","cde"))
-- 3   5

-- 字符串反转
print(string.reverse("abcdef"))

-- 截取字符串
-- 方式一,起始位置到结尾
print(string.sub("abcdef",3))
-- cdef

-- 方式二,起始位置和结束位置,C#是截取长度
-- 负数时倒数第几个
print(string.sub("abcdef",3,-2))
print(string.sub("abcdef",3,#"abcdef"-1))
-- cde

-- 字符串格式化
-- 参数:需要被格式化的字符串(包含占位符),格式化的内容
print(string.format("Im the %d player,other is %d",1,2))

-- 字符串重复
print(string.rep("abc",4))

-- ASCI 码转字符
print(string.char(65))

-- 字符转ASCI
print(string.byte("A"))

--字符串替换
-- 原始串,替换内容,替换后内容
print(string.gsub("abcd","bc","**"))

07数组Table

local data={}
-- 起始索引是1开始
-- 类型可以混合
-- 索引可以成负数
-- 也可以给0索引
-- 索引可以断开
-- 初始化时没有索引的值,从1开始累加
data={"abc",123,[-1]=100,[0]=99,[4]=233,"afafafaf"}
print(type(data))
print(data[3])

-- 获取长度
-- #data,会计算从1开始连续的数据
print(#data)

-- 修改
data[1]="def"
print(data[1])

-- 二维数组
local data2={{"aa","bb"},{11,22}}
print(data2[2][1])-- 11

-- 数组再lua中使用Table实现的

08运算符

-- 2的3次方
print(2^3)

-- C#!=不等于,Lua ~=
print(1~=2)

-- Lua没有++ ,--
local  i = 0
i=i+1

-- Lua 没有+=,-=,*=

09 条件判定

判断

  • 嵌套
  • Lua无Switch
local conl=false

-- then 代表起始大括号
-- end 代表结束大括号
-- else 代表结束和起始大括号
-- elseif 后面得根then
if(conl)
then
    print("条件1达成")
elseif(true)
then
    print("条件3达成")
else
    print("条件2达成")
end
if(true)
then
    if(true)
    then
        print("进入第二层")
    end
end

循环

-- 循环
local num = 1
while(num<3)
do
    print(num)
    num=num+1
end
local  num = 1
repeat
    print(num)
    num=num+1
until(num>5)
repeat
    if(1)
    then 
        print("")
        break
    end
    if(2)
    then 
        print("")
        break
    end
    if(3)
    then 
        print("")
        break
    end
until(false)

for

local data={"aa","bb","cc"}

-- 参数1:变量初始值,遍历Lua表使用1
-- 参数2:增长到多少
-- 参数3:增长步长
for i=1,#data,2
do
    print(data[i])
end
-- aa cc

-- 倒叙
for i=#data,1,-1
do
    print(data[i])
end

迭代器

-- 迭代器[遍历table]
-- one 不加中括号的字符串索引
-- "aa" "bb" 自动加1,2索引
-- [4] 制定数字索引
-- [-1] 制定负数索引
-- ["two"] 加中括号的字符串索引

local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}


-- 连续索引迭代器
-- 连续数字索引迭代器,只会获取从1开始的数字索引,必须是连续的
for k,v in ipairs(data)
do
    print("k:".. k..",v:"..v)
end

print(".................")
-- 所有数值迭代器
-- 相对于ipairs去掉了i,相当于取消int迭代器
-- 获取table长度稳定方法,使用所有数值迭代器
for k,v in pairs(data)
do
    print("k:".. k..",v:"..v)
end

10 函数

-- 脚本型语言,从上往下执行
-- 需要先定义,后执行
-- 函数
function func1()
    print("这是func1")
end

func1()
-- 将函数定义为一个变量,函数是一个数据类型
local func2=function()
    print("这是func2")
end

-- 可以多于形参,不能少于形参
local  func3 = function(a,b)
    print(a+b)
end

func3(5,7)
func3(5,7,9)

-- 累加
local func4=function(...)
    -- 无固定参数,转化为table
    -- arg作用域为func4函数体
    local arg={...}
    local total=0
    for k,v in pairs(arg)
    do
        total=total+v
    end
    print(total)
end

func4(1,2,3)
func4(1,2,3,4,5)

  • 返回值
-- 返回多个值
function func5()
    return 99,100
end
-- 接受多个值
local num1,num2=func5()

print(num1)
print(num2)

11Table

--  Table支持数据索引存储疏忽
-- Table支持字符串索引(关联索引)存储数据
-- 用表实现面对对象

local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}

print(data[2])
print(data["one"])
print(data.two)

-- 函数也是种数据类型
-- func1索引下定义一个函数
data.func1=function()
    print("data表中func1函数")
end

data.func1()
----------------------------------
data.func2=function()
    print(data.two)
end

data.func2()
-------------------------------
-- 第一种self写法
-- 成员函数定义是,显示加入self变量,对应C#的this
-- 函数内部可以通过self获取当前table的其他值
data.func3=function(self)
    print("func3"..self.two)
end
-- :代表把当前表传递给self
data:func3()

-- 第二种self写法,
-- 隐式给self赋值
function data:func4()
    print("func4"..self.two)
end
data:func4()

12 子文件加载和元表

请添加图片描述

-- 实现代码的切分

-- 预加载目录
print(package.path)

-- 将提供的Lua文件中的代码执行一下
-- 文件名种包含“.”等特殊符号会导致加载错误
-- 文件扩展名“.lua”不需要添加,会自动添加
require("01.HelloWorld")-- 错误

热更新

-- 值会加载一次
-- 表会标记已经加载的文件记录
-- package.loaded 存储文件加载路径
print(package.loaded["subfile/subfile1"])
package.loaded["subfile/subfile1"]=nil

-- 每次加载文件时,会检查package.loaded 内容
-- 如果向重新加载,需要清理,置为nil
require("subfile/subfile1")
  • 变量传递
-- config文件

-- 全局变量
APPNAME ="HSXD"

local config = {}

config.appName="hxsd"

return config



-- 获取另一个文件的返回值
-- 子文件的return会返回给主文件变量
local config= require("subfile/config")
print(config.appName)
print(APPNAME)

13元表

local t1={1,2,3}
-- 期望打印table是,以{1,2,3}方式显示
print(t1[1])
print(t1[2])
print(t1[3])


-- 打印时,将表作为字符串输出
-- 这种办法,Lua提供特性,metatable扩展
setmetatable(
    t1, -- 需要进行元表扩展的数据表
    {      -- 拥有扩展t1的元表,只要再元表种实现一些特殊的函数
            -- t1就可以实现特殊的功能
        __tostring = function(t)-- 元方法,被当成字符串使用,有则自动调用
            local format="{"
            for k,v in pairs(t)
            do
                print(v)
                format=format.."("..k ..",".. v .. "),"
            end

            format=format.."}"
            return format
        end
    }
)
-- t1会传递给t
print(t1)

mytable = setmetatable(
    { 10, 20, 30 }, 
    {
        __tostring = function(mytable)
        sum = 0
        for k, v in pairs(mytable) do
                    print(k..','..v)
                    sum = sum + v
            end
        return "表所有元素的和为 " .. sum
        end
    }
)
print(mytable)