Lua

概览


Lua IDE 脚本

01Hello World.lua

--脚本的后缀名必须是.lua

-- 单行注释

--[[
多行注释
/*
asdasd
*/
]]--

--print是lua内置的方法
--字符串可以用双引号表示,也可以用单引号表示
--行尾没有分号
print('Hello World')

02变量.lua

--[[命名规范
1.不需要定义类型,根据存储的类型,决定采用什么类型
2.变量名不能以数字开头
3.尽量避免下划线和大写字母开头,这种格式Lua自身保留(e.g. _Name)
4.推荐使用驼峰命名法,跟c#一样
5.练习:小红 16 false  QingDao
]]--

name ="xiaoming"
age=18
sex = true
school = '蜗牛'

print(name,age,sex,school)
---------------------------------------------------
name='xiaohong'
age=16
sex=false
address='QingDao'

print(name,age,sex,address)

-----------------------------------------------------
--[[Lua table(表)
1.初始化表
mytable = {}

2.指定值
mytable[1]='Lua'

3.移除引用
mytable = nil

4.lua 垃圾回收会释放内存

]]--
myTable = {"小红",16,false,'QingDao'}

print(myTable[0])  --打印出了nil,nil表示空数据,相当于c#中的null
print(myTable[1])  --索引从1开始
print(myTable[2])
print(myTable[3])
print(myTable[4])

------------------------------------------------------
--[[观察类型
1.number表示小数类型,lua中没有整型
2.string表示字符串类型
3.boolean表示布尔类型,里面存储true和false
4.table表示表类型
5.nil表示空
]]--

print(type(name))
print(type(age))
print(type(sex))
print(type(school))
print(type(myTable))

-------------------------------------------------------
--全局变量和局部变量
--默认都是全局变量,局部变量前需要加local
--代码块中声明的局部变量当运行结束后会被释放
local playerHP = 100

03运算符.lua

num1 = 12;
num2 = 34;

--[[算术运算符
+、-、*、/、%
没有++、--、+=、-=
]]--

res1=num1+num2
res2=num1-num2
res3=num1*num2
res4=num1/num2
res5=num1%num2

print(res1,res2,res3,res4,res5)

--[[关系运算符
< <= > >= == ~=
]]--
res6 = res1 ~=res2
print(res6)
res7 = res1 < res2
print(res7)
res8 = res1 >res2
print(res8)
res9 = res1<= res2
print(res9)
res10 = res1>= res2
print(res10)
res11 = res1 ==res2
print(res11)

--[[逻辑运算符
and or not分别对应c#中的&&、||、!
]]--
--一假即假
res12 = res6 and res7
--一真即真
res13 = res6 or res7
res14 = not res6
print(res12)
print(res13)
print(res14)

04条件结构.lua

--条件结构

num1=1;
num2=2;

--if
--then ...end相当于c#中的{},是一个代码块
if num1 < num2
    then
        print('num1 < num2')
        print(num2)
        local num3 = 3
        print(num3)
    end
print(num2)
print(num3)


--if ...else
if num1 > num2 then
    print('num1 > num2')
else
    print('num1<=num2')
end


---------------------------------
--if ..elseif..else
hp=5;
if hp >= 80 and hp <= 100 then
    print("健康")
elseif hp < 80 and hp >= 60 then
    print('良好')
elseif hp < 60 and hp >= 10 then
    print('注意血量')
else
    print('即将死亡')
end

05循环结构.lua

--循环结构

--while 条件 do 循环语句 end
--[[
index = 1
while index < 100 do
    print(index)
    index = index + 1
end
]]--

-- 1-100所有的偶数
--[[
index1 =1

while index1<=100 do

    if index1%2==0 then
        print(index1)
    end
    index1=index1+1
end
]]--

-- 1-100所有奇数的和5000
--[[
index2=1
sum=0
while index2<=100 do

    if index2%2==1 then
        --print(index2)
        sum=sum+index2

    end
    index2=index2+1
end
print(sum)
]]--

---------------------------------
--repeat 相当于c#中的do while
--[[
index3=0
repeat
    print(index3)
    index3 =index3 +1
until index3>100
]]--

----------------------------------
--for
--[[
for i=1,100 do
    print(i)
end
]]--
-----------------
--[[
for i=1,100,2 do
    print(i)
end
]]--
-----------------
--[[
for i=100,1,-1 do
    print(i)
end
]]--
------------------
--1-100之间所有的素数,并记录有多少个
print(2)
count1=1
isSuShu=true
for i =3,100 do
    for j=2,i-1 do
        --不是素数
        if i%j==0 then
            isSuShu=false
            break
        end
    end

    if  isSuShu==true then
        print(i)
        count1=count1+1
    else
        isSuShu=true
    end
end
print('---------------------')
print("素数个数:",count1)

06方法.lua

--方法

--定义方法
function Plus(a,b) --带返回值的方法
    return a + b
end

--调用方法
res1 = Plus(12,34)
print(res1)


function Mul(c,d) --不带返回值的方法
    print(c*d)
end
Mul(3,4)

function M()
    print('qwer')
end

M()


print(math.max(12,34,89,56,67,78))
print(math.abs(-12))
print(math.random())

07字符串.lua

--字符串

str = "XiaoMing Age is 18, Sex is 男,in Snail"

--都转化为小写
print(string.lower(str))
--都转化为大写
print(string.upper(str))


--截取字符串,索引从1开始
print(string.sub(str,1,4))

--拼接字符串
s = ", 学习好"
print(str..s)

08table.lua

--table
--[[创建方式1
myTable = {}
--添加元素
myTable[1]=12
myTable[2]=34
myTable[5]=100
myTable["name"]="xiaoming"

--访问和赋值
print(myTable[2])
print(myTable["name"])  --当表里面的元素是字符串时,可以["字符串"]或.字符串的方式访问和赋值
print(myTable.name)
myTable.age=18
print(myTable.age)
print(myTable["age"])
]]--

--创建方式2
--[[
myTable={name="xiaoming",age=18,sex=true}
myTable.address="蜗牛"
print(myTable.name,myTable["age"],myTable["sex"],myTable.address)
]]--

--当没有键的时候,会自动分配从1开始的索引
--table中最好不要出现nil
--[[
myTable={12,34,nil,age=56,78,"xiaoming",true}
print(myTable[1],myTable[2],myTable[3],myTable[4],myTable[5],myTable.age)
]]--
--[[
--得到表的长度
--有键的和nil不算一个元素长度
myTable={name="xiaoming",nil,age=18,sex=true}
print(#myTable)

--遍历,使用迭代

--1.pairs用于遍历有key的table

myTable01={name="xiaoming",age=18,sex=true,address="蜗牛"}
for key,value in pairs(myTable01) do
        print(key,value)
end

--2.ipairs用于遍历没有key的table

myTable02={"xiaoming",12,true,"蜗牛"}
for index,value in ipairs(myTable02) do
        print(idnex,value)
end
]]--

--3.混合
myTable03={"xiaoming",age=18,sex=true,"蜗牛"}
for key,value in pairs(myTable03) do
        print(key,value)        --先把没有键的打印出来,后打印有键的
end
print("-----------------------------------------------------------")
for key,value in ipairs(myTable03) do
        print(key,value)        --只打印出了没有键的
end
print("-----------------------------------------------------------")
myTable04 ={"xiaoming",[4]="age",[3]="sex",[6]="address",false}
for key,value in pairs(myTable04) do
    print(key,value)        --先把没有键的打出来,后打有键的,有键的索引会乱掉
end
print("-----------------------------------------------------------")table.insert(myTable03,2,100)
table.remove(myTable03,age)     --??????????
for k,v in pairs(myTable03) do
        print(k,v)
end
print("-----------------------------------------------------------")
scores={80,50,70,60,100,90}
table.sort(scores)
for i,v in ipairs(scores) do
        print(v)
end

print(table.concat(scores))
print("-----------------------------------------------------------")

09面向对象.lua

--面向对象思想

Player = {}

local this=Player

--定义并声明对象属性
this.name="xiaoming"
this.level=12
this.sex=true

--[[
function M1()
    print(this.name,this.level,this.sex)
end

M1()
]]--

this.M1=function()
    print(this.name)
end

this.M1()

this.M2=function()
    print(111)
    this.M1()
end

this.M2()

10LuaScript.lua

--引用库文件,这个文件必须跟此lua文件同目录
require "luanet"
--加载命名空间
luanet.load_assembly("System")
luanet.load_assembly("Lua_Test01")

--导入类型
Int32InLua = luanet.import_type("System.Int32")
ProgramInLua = luanet.import_type("Lua_Test01.Program")
--字符串类型转换为数字类型
num = Int32InLua.Parse("1234")
print(num)
--保存C#中的Program类
p = ProgramInLua()

--普通方法通过对象:调用
p:M()    --调用Program类中的M方法

--静态方法通过类.调用
ProgramInLua.MStatic()    --调用Program类中的MStatic方法


C# IDE 脚本

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace Lua_Test01
{
    class Program
    {
        int n = 10;

        static void Main(string[] args)
        {

            //创建Lua解析器
            Lua lua = new Lua();

            #region MyRegion

            lua["num"] = 2;   //相当于在lua中书写num=2
            lua["str"] = "a string";  //相当于在lua中书写 str="a string"
            lua["sex"] = true;
            lua.NewTable("myTable");    //myTable={}

            //Console.WriteLine(lua["num"]);
            //Console.WriteLine(lua["str"]);
            //Console.WriteLine(lua["sex"]);

            double d = (double)lua["num"];
            string s = (string)lua["str"];
            //Console.WriteLine(d);
            //Console.WriteLine(s);

            //在VS中执行Lua代码,通过DoString()方法
            lua.DoString("name='xiaoming'");
            lua.DoString("age=18");
            object[] os = lua.DoString("return name,age");
            Console.WriteLine(os.Length);
            Console.WriteLine(os[0]);
            Console.WriteLine(os[1]);

            //在VS当中执行Lua文件,通过DoFile()方法
            lua.DoFile("09面向对象.lua");

            #endregion

            //将C#的普通方法注册到lua中
            Program p = new Program();
            //p.M();
            lua.RegisterFunction("MInLua",p,p.GetType().GetMethod("M"));
            lua.DoString("MInLua()");

            //将C#中的静态方法注册到lua中
            lua.RegisterFunction("MStaticInLua", null, typeof(Program).GetMethod("MStatic"));
            lua.DoString("MStaticInLua()");

            lua.DoFile("LuaScript.lua");


        }
//普通方法
        public void M()
        {
            Console.WriteLine("普通方法");
        }
//静态方法
        public static void MStatic()
        {
            Console.WriteLine("静态方法");
        }
//引用参数方法
        public void MRef(string name,ref int count)
        {
            Console.WriteLine(name);
            Console.WriteLine(count);
            count = name.Length;
        }
//输出参数方法
        public void MOut(string name, out int count)
        {
            Console.WriteLine(name);
            count = name.Length;
        }

    }
}

1.C#要想使用Lua文件,需要引用LuaInterface命名空间
2.Lua要想使用C#文件,需要引用luanet


LuaInterface命名空间

类:Lua

  1. 创建Lua解析器:类名 对象 =new 类名();
  2. 在C#环境中写lua变量:lua["变量名"]=数字/字符串/true/false
  3. 在C#中声明lua表:对象.NewTable("变量名");
  4. 将lua变量转化为C#中的变量:对应的类型 变量名=(要转换的类型)lua["lua变量名"];
  5. 在VS中执行Lua代码:对象.DoString();
  6. 在VS中执行Lua文件:对象.DoFile("lua文件名.lua");
  7. 将C#普通方法注册到lua中:对象.RegisterFunction(在lua中的方法名字,C#中的目标类,目标类中的方法);

Luanet库文件

在lua IDE使用

  1. 引用库文件:require"luanet"
  2. 加载命名空间:luanet.load_assembly(命名空间名)
  3. 导入类型:luanet.import_type(命名空间名.类名)
  4. 普通方法通过对象:调用
  5. 静态方法通过类名.调用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容