Lua学习总结二

Lua 运算符 Lua 运算符 主要学习C++中没有的运算符! Lua 运算符 运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型: 算术运算符 关系运算符 逻辑运算符 其他运算符 算术运算符 下表列出了 Lua 语言中的常用算术运算符,设定 A 的值为10,B 的值为 20: 操作符 描述 阅读详情

1.Lua中的循环

Lua中的循环和与C#非常类似,只是方法块没有{ }来包围。

比如while循环:

a=1
while (a<=10) do
    print(a)
    a=a+1      --Lua中没有a++ a--这种形式的运算哦!
end

这就是while循环的使用,至于for循环我们上一篇中展示过了数值for循环,但是Lua中还有一种叫做泛型for循环。

我们先看看数值for循环的例子:

for a=1,10,3 do  --1,10,3  分别代表开始、结束、步长,步长不指定的话默认为1
    print(a)
end

运行结果如下:

Lua学习总结二

很好理解,代码加上运行结果,一目了然了。

其实泛型for循环也很好理解,与C#中的foreach很相似,只是使用for循环来写:

tab={ ley1="ant",key2="mumu" }

for k,v in pairs(tab) do
   print(k,v)
end

运行结果:

Lua学习总结二

repeat  until循环:重复循环直到满足条件,满足条件后就不在循环了:

a=1

repeat
    a=a+1
    print(a)
until (a>5)

一个很新颖的写法,但是和C#中do while循环把判断条件放在后面是一样的。运行结果:

Lua学习总结二

循环进阶那就是循环的嵌套喽,我随手就写了一个冒泡排序:

tab={ 1,3,8,5,6,9,4,2}

for a=1,8 do
	for b=a+1,8 do
		if tab[a]>tab[b] then
			tab[a],tab[b]=tab[b],tab[a]
		end
	end

end

for a=1,8 do
	print(tab[a])
end

运行结果:

Lua学习总结二

堪称完美~~

2.流程控制

流程控制自然说的就是if else啦,与C#没什么太大不同。

但是要注意的是:在Lua中出了false和nil,其他的都为true。

3.可变参数的函数

Lua中什么是可变参数的函数呢?

我们看看例子:

print()
print(1)
print(1,2)
print(1,2,3)

Lua学习总结二

我们看到这个结果首先想到的就是面向对象中的多态。

那么我们在Lua中怎么去实现这样的方法呢?

function myfun(...)      --通过...来声明一个参数个数不定的函数
	print("我输入了"..#arg.."个参数")      --输入的参数会默认放在名为arg的table中,通过#可以获得其长度
end


myfun()
myfun(1)
myfun(1,2)
myfun(1,2,3)

我们看执行结果:

Lua学习总结二

嗯,可以说是非常有意思了。

4.运算符

算术运算符方面,与C#区别不大,只是在求余数的操作时,Lua中是可以对小数求余数的,比如0.9对0.2求余数,结果为0.1。

关系运算符方面都一样。== >  <  >=  <=,唯一不同的是Lua中还提供了不相等的运算符:~=

逻辑运算符方面功能是与C#一样的,只是写法不同了而已。and=&&   or=||  not=!

比如 a and b等效于a&&b,a or b等效于a||b,not a等效于!a

5.Lua中的数组

我们可以很容易地联想到:Lua中数组是以表来实现的,因为我们接触了Lua的内置数据类型,发现之后表与数组的特性最相似。

关于表的一些使用我们在前面也提到过,但是表仍然有让人惊讶的骚操作。

比如:表的索引可以是负数,甚至表的索引可以使小数,对,没错就是小数:

tab={1,2,3,4}

for i=1.1,4 do
    print(i,tab[i])
end

for循环的初始值是1.1,但是1.1,2.1,3.1不存在对应的值,所以为nil。

Lua学习总结二

当然了我们可以为它们赋值:

Lua学习总结二

为什么会出现这种情况呢

我思考的结果是:Lua中已经淡化了索引的概念,因为表中数据就是以key-value形式存在的,连字符串都能成为"索引",小数怎么就不行了?所以我觉得对于Lua中的表,不能完全用C#中的数组特性来理解,而是更多地把它看做是字典。

6.Lua中的迭代器

所谓的迭代器呢我们一般在遍历的时候会用到。比如在C#中我们会有这种形式:

int[] array=new int[];

xxxxxx
//一系列操作
xxxxxx

foreach(int num in array){
      if(xxxxxx){
        xxxxxxxx
    }
}

而在Lua中我们之前有过例子就很类似于C#中的foreach:

tab={key1="a",key2="b",key3="c"}

for k,v in pairs(tab) do
      xxxxxx
end

这里面的pairs就是一个内置好的迭代器,简单理解就是它可以代表tab中的每一个元素。Lua中还有一个内置迭代器ipairs。

它们的区别是:

pairs会遍历表中所有的数据元素,但是ipairs会遍历到第一个值为nil的元素为止。

比如tab[1]="a",tab[2]===nil,tab[3]="c"

遍历的时候如果使用ipairs来输出表中的值,只会输出第一个,因为第二个为nil,往后就终止遍历了,第三个自然也就访问不到了。

7.Lua中的表

table是Lua中非常重要的数据类型,因此我们不得不花费较多的时间来学习它。

实际上Lua中的table是一个"引用类型",为什么这么说呢?我们来看看:

tab1={1,2,3,4,5}

tab2=tab1

print(tab1[1])
print(tab2[1])

tab2[1]="a"

print(tab1[1])
print(tab2[1])

输出结果:

Lua学习总结二

试问如果tab1和tab2不是指向同一个对象,那么修改了tab2[1]的话,为什么tab1[1]也会发生变化呢?没理由呀!

那么我们在释放内存的时候仅仅通过tab1=nil就行了吗?

显然不行,tab1为nil,可是那一块内存区域还有tab2持有引用呢,所以当tab2也为nil的时候,这块内存区域才会被垃圾回收机制释放掉。我觉得这里是需要注意的地方。

我们在C#编程环境下做了验证,结果也是一样的:

class Program
    {
        static void Main(string[] args)
        {
            int[] array = new int[3] { 1, 2, 3 };

            int[] array2 = array;

            Console.WriteLine(array[0]);
            Console.WriteLine(array2[0]);

            array2[0] = 5;

            Console.WriteLine(array[0]);
            Console.WriteLine(array2[0]);

            Console.ReadKey();
        }
    }

输出结果:

Lua学习总结二

8.Lua中table提供的方法函数

table.concat方法:拼接表中元素,有三个重载。

tab1={1,2,3,4,5}

print(table.concat(tab1))		--无间隙拼接表内元素
print(table.concat(tab1,"-"))	--使用指定字符来连接
print(table.concat(tab1,2,4))	--了解表内指定范围的元素

输出结果:

Lua学习总结二

table.insert()方法:向表中插入元素

这个方法方便了我们向表中添加元素:

tab1={1,2,3,4,5}

table.insert(tab1,6)      --直接调用方法,默认向末尾插入值
table.insert(tab1,2,1.1)  --向指定位置插入值
for i=1,#tab1 do
	print(tab1[i])
end

输出结果:

Lua学习总结二

table.remove()方法:移除表内的元素

Lua学习总结二

上面的例子中我们通过将其中一个元素置为nil来删除元素,但是我们却发现后面的元素没有向前移动,我们在遍历相关元素的时候有可能会出现问题的。所以我们通过Lua中table提供的方法来移除表中的元素:

tab1={1,2,3,4,5}

table.remove(tab1)
table.remove(tab1,2)

for i=1,#tab1 do
	print(tab1[i])
end

我们可以看到运行结果:

Lua学习总结二

这样一来我们移除元素之后的表内的每一个元素都是有意义的,减少了可能会出现的错误。

table.sort()方法:对表中元素进行排序

表中元素如果是number类型的,则会按照数字的大小从小到大排序,如果是字符串的话,则会按照ASCII码表的顺序进行排序。

 

内容很多,有理解错误的地方欢迎大佬们批评指正,谢谢!

Lua 学习教程之android与lua相互调用() 在Android项目中使用Lua,需要两个步骤: 1、加载Lua脚本解析引擎。 2、以Native API方式调用引擎接口 直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )对这些JNI接口进行了很好的封装,它是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的Java接口。 1.获取LuaJava 工程,引入到你的Eclipse中,并将其设为 阅读详情

相关推荐

Amesim(五):单个悬架系统搭建

一、组成 单个悬架系统组成包括:端子,质量块*2,弹簧,阻尼器,速度路面反馈,路面激励。 、搭建 打开Amesim,在 library 选择 1D Mechanical 选择质量模块,添加到skech中,并按 ctrl+r 旋转质量块,将箭头朝上,设置规定的力传递正方向 添加弹簧阻尼器,与质量块连接 添加VX模块,将路面的激励传递转化为速度和位移,传递给悬架系统 在...

林小川的博客 7107

Lua基本语法

Lua基本语法 Lua中的关键字 Lua中的保留字,这些保留的字不可以被用作常量或变量,或任何其他标识符。 and break do else elseif end false for function if in local nil not or repeat return then true until while Lua中的保留字如下:关键字不能当作标识符,Lua大小写敏感。 注意事项 ...

Bluce张のGameNote 4303

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小乘的问题求解

氢键H-H 5632

lua 条件语句

lua 条件语句

weixin_43931625的博客 1091

Lua 数据类型

assasa

qq_37601157的博客 187

Lua基础 类型和值(

5.Table Lua的table类型比较强大,用过都知道,它的index不仅可以使用number,还能使用string等其他的值,nil除外。table没有固定的size,你可以动态地向table中添加元素。table是Lua中的主要数据结构。在Lua中,我们用table来表示普通数组,符号表,set,record,queue和其他的lua数据结构。Lua也使用table来表示module,p...

互联网 280

Lua学习

1.对于Lua而言,函数其实也是一种变量,故而系统的函数名实际上也是一种变量名: a={p=print} a.p("good") 输出good 2.函数定义,实际上是将一个类型为function的变量(整个函数chunk)赋值给一个自定义变量 3.Lua的表构造提供了一个排序函数,可以对一个表进行排序,table.sort(t,function(a,b)),此函数接受两个参数,第一个是待

oahsgnat的专栏 549

Lua学习笔记之C中调用Lua

虽然之前看过《Lua程序设计》(第版)这本书,但对C与Lua交互的部分,一直不是很理解。最近想系统学习和深入理解C与Lua的交互(实质是想通过这个,进一步阅读Lua源码,:)),因此又看了一下这本书的第4部分,下面是在学习C中调用Lua的全局变量、table和函数的笔记以及自己的理解,其中学习过程中的写的代码可以从我的github下载。      0、Lua与C有两种交互形式。在第一种

MaximusZhou的专栏 2447

LuaLua学习笔记(

LuaLua学习笔记(

FEZ98 1091

lua学习学习

lua学习学习

谢健的专栏 449

Lua学习篇②——基本语法

我有个习惯,学习一门新的语言的时候肯定要先写出最基本的“Hello World”的程序,当做一个正式开始的标志。Lua的语法其实特别简单,那么一起来编写第一个小程序来了解Lua的基本语法吧。"Hello World"小程序下载了Lua的解释器后我们可以打开cmd命令行窗口,键入lua进入Lua的交互式编程环境,如下图之后我们键入print("Hello World"),回车后控制台将输出Hello...

轩阳俊的博客 4099

Lua学习

本篇继续接着上一篇博客继续记录博主学习lua的路程

m0_52021450的博客 461

lua学习 lua如何调用库函数

microsoft Visio 2013 新建win32空项目 ----- 下一步-----选择dll和导出数据 // Win32Project1.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "Win32Project1.h" #include "lua.hpp" extern "C" { #include "lua

学习笔记 1902

Lua学习-循环

Lua学习 lua中的循环 1.while循环体 语法 while(条件) do 循环体 end 例如:输出1-20的数字 local a=1 while(a<20) do print(a) a=a+1 end 结果 2.for循环 for循环有两种 (1)数值for循环 语法 for i=temp,temp2 do 循环体 end 其中i是局部变量,temp是数值,temp2是要到达的目标 例如:输出1-20的数字 for i=1,20 do print(i) end 结果 (2)泛

qq_45047433的博客 274

lua学习(4)_____表达式、语句

前面讲完了lua的基本类型,现在我们来看看lua表达式和语句语法的特别之处。 1.表达式: 讲表达式肯定就要先从操作符入手,其他的语言一般操作符分为 算术操作符、关系操作符、逻辑操作符。不过lua中还有一个字符串连接操作符。 先从算术操作符讲起: lua支持常规的算术操作符有:一元的"-"(负号), 元的 "+"(加号), "-"(减号), "*"(乘号), "

YzlCoder的记事本 2081

lua语言的if判断语句

lua语言的判断比较迷,0被视为真 a=0 b=(a==0) c=(a==1) d=1 print(a) print(b) print(c) if(b) then print("a==0 means true") end if(b==1) then print("true means 1") else print("true do...

Li03 7105

LUA教程表达式逻辑运算符-10

Lua 中的逻辑操作符有 and, or, 以及 not。和控制结构一样,所有的逻辑操作符把 false 和 nil 都作为假,而其它的一切都当作真。 and or not 逻辑运算符认为false和nil是假(false),其他为真,0也是true. and和or的运算结果不是true和false,而是和它的两个操作数相关。 a and b -- 如果a为false,则返回a,否则返回b a or b -- 如果a为true,则返回a,否则返回b .

511遇见 2311

lua中的运算符与if语句

--lua中的运算符 加+ 减- 乘* 除/ a=3+5 b=3-1 c=11-2*2 d=1+9/3 print(a,b,c,d) --关系运算符 大于&gt; 小于&lt; 等于== 不等于~= 大于等于&gt;= 小于等于&lt;= --结果是布尔值 a=22 b=212 print(a,"&gt;",b,"=",a&gt;b) print(a,"&lt;",b,"

8266

Lua中and、or的一些特殊使用方法

Lua中的逻辑运算符:与(and)、或(or)和非(not),与其它语言的逻辑运算符功能一致,这里不做赘述。仅仅说一点,全部的逻辑运算符将false和nil视为假,其它不论什么东西视为真。0也视为真。 这里要说的是and和or的一些特殊使用方法。 当连接2个操作数时: 1.对于运算符and...

weixin_33832340的博客 2795

Lua学习笔记(

3.表达式 3.1 算数表达式 元运算符:+-*/^ 一元运算符:-(负值) 3.2 关系运算符 < > <= >= == ~= ==和~=比较两个值,如果两个值类型不同,Lua认为两者不同,nil只和自己相等。 3.3 逻辑运算符 and or not 逻辑运算符认为false和nil是假,其他为真 and和or的运算结果不是true和false,而是和他两个操

路漫漫,水迢迢 1606

2024java面试题.pdf

在2024年的Java面试中,可能会遇到各种类型的问题,这些问题涵盖了Java的基础知识、高级特性、设计模式、框架应用、并发编程、JVM原理等多个方面。以下是一些常见的Java面试题及其答案概览:在2024年的Java面试中,可能会遇到各种类型的问题,这些问题涵盖了Java的基础知识、高级特性、设计模式、框架应用、并发编程、JVM原理等多个方面。以下是一些常见的Java面试题及其答案概览:在2024年的Java面试中,可能会遇到各种类型的问题,这些问题涵盖了Java的基础知识、高级特性、设计模式、框架应用、并发编程、JVM原理等多个方面。以下是一些常见的Java面试题及其答案概览:在2024年的Java面试中,可能会遇到各种类型的问题,这些问题涵盖了Java的基础知识、高级特性、设计模式、框架应用、并发编程、JVM原理等多个方面。以下是一些常见的Java面试题及其答案概览:在2024年的Java面试中,可能会遇到各种类型的问题,这些问题涵盖了Java的基础知识、高级特性、设计模式、框架应用、并发编程、JVM原理等多个方面。以下是一些常见的Java面试题及其答案概览:

上一篇: Lua学习总结一
下一篇: Lua学习总结三
博士装呗
博客等级 码龄11年 63粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值