Lua语法的代码演示

勇哥注:

这里用代码方式演示一下Lua的语法,方便大家快速了解。

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

设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 特性
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,
Lua可以使用它们,就像是本来就内置的功能一样。
其它特性:
支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
语言内置模式匹配;闭包(closure);函数也可以看做一个值;
提供多线程(协同进程,并非操作系统所支持的线程)支持;
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,
比如数据抽象,虚函数,继承和重载等。



几点说明:

  1. 下面演示代码中,OutMsg是C#中定义好的一个函数,原型是:  void OutMsg(string msg),而lua的对应功能是print函数

  2. lua对大小写敏感

  3. 以关键字local定义的变量是局部变量,其它都是全局变量,即使在方法内部定义的也一样

  4. 单行注释是: --  ,多行注释是:--[[ 多行注释 --]]


(一)关键字

image.png


(二)运算符

lua的数值计算符号跟C#一样。

关系运算符就是不等于不一样。

image.png


(三)数据类型

image.png


(四)循环

//循环

for i=1,10,1 do

    OutMsg(tostring(i))

end


//倒序

for i=10,1,-1 do

    OutMsg(tostring(i))

end


//注意..是字符串连接, 注意下面的a会被自动转为字符串

while( a < 20 )

do

   OutMsg("a 的值为:" .. a)

   a = a+1

end


//注意,break支持,但是没有continue,但是可以用goto语句来代替

a = 1

repeat

   OutMsg("a 的值为:" .. a)

   a = a + 1

   if( a > 3) then

      break

   end

until( a > 15 )

end


//goto语句

for i = 1, 10 do  

    if i == 5 then  

        -- 当 i 等于 5 时,跳过当前迭代  

        goto continue  

    end  

    -- 执行的代码  

    print(i)  

    ::continue::  

end


(五)数组 


//下标是从1开始,table.remove可以删除数组第几个元素,   #符号求数组长度, 如果指定索引没有值返回nil

local  str=""

local myArray = {10, 20, 30, 40, 50}

table.remove(myArray, 3)

for i=1,#myArray,1 do

   str=str .. myArray[i] .. ","

end

OutMsg(str)

end


//用迭代器循环数组元素, key是索引, value是值

local  str=""

local myArray = {10, 20, 30, 40, 50}

for key,value in ipairs(myArray)

do

   str=str .. value .. ","

end

OutMsg(str)



(六)table(表)


table(表)是Lua特有的功能强大的东西

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。

Lua table 是不固定大小的,你可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 

例如string.format表示使用"format"来索引table string。


(1) table的构造

-- 初始化表

mytable = {}


-- 指定值

mytable[1]= "Lua"


-- 移除引用

mytable = nil

-- lua 垃圾回收会释放内存


(2)基本使用

 mytable = {}

OutMsg("mytable 的类型是 " .. type(mytable))


mytable[1]= "Lua"

mytable["wow"] = "修改前"

OutMsg("mytable 索引为 1 的元素是 " .. mytable[1])

OutMsg("mytable 索引为 wow 的元素是 " .. mytable["wow"])


-- alternatetable和mytable的是指同一个 table

alternatetable = mytable


OutMsg("alternatetable 索引为 1 的元素是 " .. alternatetable[1])

OutMsg("mytable 索引为 wow 的元素是 " .. alternatetable["wow"])


alternatetable["wow"] = "修改后"


OutMsg("mytable 索引为 wow 的元素是 " .. mytable["wow"])


-- 释放变量

alternatetable = nil

OutMsg("alternatetable 是 " .. tostring(alternatetable))


-- mytable 仍然可以访问

OutMsg("mytable 索引为 wow 的元素是 ".. mytable["wow"])


mytable = nil

OutMsg("mytable 是 " .. tostring(mytable))


输出结果为:


mytable 的类型是 table

mytable 索引为 1 的元素是 Lua

mytable 索引为 wow 的元素是 修改前

alternatetable 索引为 1 的元素是 Lua

mytable 索引为 wow 的元素是 修改前

mytable 索引为 wow 的元素是 修改后

alternatetable 是 nil

mytable 索引为 wow 的元素是 修改后

mytable 是 nil


(3)Table 操作


//table.concat

 mytable = {}

for i=1,10,1 do

  mytable[i]= "a" .. i

end


--连接全部

--str=table.concat(mytable,",")  


--连接索引1到9的元素

str=table.concat(mytable,",",1,9)   

OutMsg(str)



//其它内建函数

table.insert (table, [pos,] value):

在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.


table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。


table.sort (table [, comp])

对给定的table进行升序排序。



(七)函数


//带返回值的函数

--[[ 函数返回两个值的最大值 --]]

function max(num1, num2)

   if (num1 > num2) then

      result = num1;

   else

      result = num2;

   end

   return result;

end


-- 调用函数

OutMsg("两值比较最大值为 ",max(10,4))

OutMsg("两值比较最大值为 ",max(5,6))


//函数可以当做参数传递进

myprint(10)

-- myprint 函数作为参数传递

add(2,5,myprint)


myprint = function(param)

OutMsg("这是打印函数 -   ##" .. param .. "##")



function add(num1,num2,functionPrint)

   result = num1 + num2

   -- 调用传递的函数参数

   functionPrint(result)

end


//多个返回值,注意你得用两个变量去接收,它并不是返回一个数组或者table

function LuaFunction()

local res1,res2=maximum({8,10,23,12,5})

OutMsg("两个返回值:" .. res1 .. "," .. res2)


function maximum (a)

    local mi = 1             -- 最大值索引

    local m = a[mi]          -- 最大值

    for i,val in ipairs(a) do

       if val > m then

           mi = i

           m = val

       end

    end

    return m, mi

end


//没返回值的函数

你只需要在自定义函数最后不写return,此时系统会返回一个nil

对于这种没返回值的函数,你可以不用定义一个变量来等于它。


//可变参数函数

如果有此需要的话,参考下面的文章:

https://www.runoob.com/lua/lua-functions.html



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-02-27 11:22:01 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864