Lua程序设计(待补充)

关于Lua

游戏开发应用中Lua和C#的区别

Lua可以在几乎所有的操作系统和平台进行编译运行,可以很方便的更新代码,更新了代码后,可以直接在手机上运行,不需要重新安装(热更新方案)。
C#只能在特定的操作系统中进行编译成dll文件,然后打包进安装包在其他平台(Android、iOS)运行,在移动平台上不能更新替换已有的dll文件,除非重新下载安装包。

语言基础

语言入门

Lua类型

Lua是动态类型定义的语言(类型可以随意改变)。
Lua中的类型有(八种):
nil boolean userdata number string table function thread

nil类型

Lua中变量不需要声明,也不需要初始化,可以直接使用。
对于没有声明和初始化的变量默认值都为nil(空类型),如:
b = nil
把一个变量置空,相当于从没有使用过这个变量,Lua会销毁b所占的内存。

boolean类型

  1. false和nil都代表false,其他任何值都代表true(0和空字符串lua都认为是true)。
  2. and 和 or都是短路运算符,如果第一个操作数可以得到结果,就不会运算第二个操作数。

userdata类型

userdata是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

局部变量与代码块

代码块可是是一个控制结构的主题、函数的主体、一个代码段(变量被声明时所咋IDE文件或字符串,交互模式中不用do-end的每一行代码都是代码段)。

尽可能使用局部变量进行编程。
首先,可以避免由于不必要的命名导致与全局变量的混乱。
其次,局部变量可以避免不同代码段的变量命名冲突。
再次,访问局部变量比访问全局变量快。
最后,局部变量会随着作用范围的结束而被垃圾收集器进行释放。

实例1:
local x = 10
if i > 20 then
  local x -->对于then来说是局部的
  x = 20
  print(x)  -->20
else 
  print(x)  -->10(全局的)
实例2:
local x1, x2 = 1, 10
do
  local x1 = 2
  local x2 = 20
end
print(x1, x2)  -->1, 10
实例3:
local a, b = 1, 10
if a < b = then
  print(a)  --> 1
  local a  --> a = nil,局部变量a将屏蔽全局变量a
  print(a)  --> 10   
  local b = b  -->局部变量b保留全局变量a此时的初值
  print(b)  -->10
end
  print(a, b) -->1, 10

控制结构

Lua的控制结构包括用于条件执行的if,用于循环执行的for、while、repeat。( 条件判断均不用(),结构体均不用{} )
if、for、while的显式终结符为end,repeat的显式终结符为until。
控制表达式的结果可以是任何值。除了false和nil,所有其他值都被当作真值,包括0和空字符串。
另外,Lua不支持switch语句。

  1. 对于repeat-until,重复执行循环体直到条件为真时结束。
    对于数值型for:
for var = exp1, exp2, exp3 do  -->第三个表达式exp3可选,若不存在,默认为1   
  something    
end  -->循环结束,控制变量var作用范围仅仅在循环体内  
  1. 对于return,有一种特殊使用情况,使用do-end。
function foo()  
  do return end  
  something  -->此时return不会结束函数的执行  
end  
  1. 对于goto的使用
    goto语句后面紧跟标签名。标签的设定是名字的名字前后紧跟两个冒号,这个设定是为了更好的突出标签。
    使用goto,Lua进行了一些限制:
    首先,标签遵循基本的可见性规则,即不能直接跳转到一个代码块中的标签(代码块中的标签对外不可见)。
    其次,goto不能直接跳转到函数外。
    最后,goto不能跳转到局部变量的作用域。
    Lua语言规范有一个细节,局部变量的作用域终止于声明变量的代码块中的最后一个有效(non-void)语句处,便签被认为是无效的语句。如下:
while some_condition do
  if some_other_condition then
    goto continue
  end
  some code
  ::continue::  ->此处的标签为无效的语句,因此if中的跳转并未包含在局部变量的范围内
end

语法补充点

  1. 多重赋值:a = 1, 2,多余的值被丢弃,即a = 1,a, b = 1,多余的变量赋值为nil,即b = nil。
  2. 变量交换:a, b = b, a,返回结果为ab值互换。
  3. type(type(x):不管x是什么值,返回的永远是String,因为type函数的返回值是String。
    因此Type()与nil作比较时nil应该加上双引号
type(X)  --nil
type(X)==nil --false,原因是type(x)返回的是string,注意,nil是一种类型,不是值,区别C++中的null。
type(X) == "nil" --true

数值

整数和小数都是number类型的,整数和小数的大小,则被认为是相等的。

相关数字常量与数字函数

  1. 常量
    math.pi,math.huge,math.maxinteger,math.mininteger
  2. 求值函数
    math.max( , values…),math.min( , values…),math.mod(value, modulus),math.pow(value, modulus),math.abs(value),math.sqrt(value)
    math.log(value) – 返回此值的自然对数(以e为底数)
    math.log10(value) – 返回以10为底数的值
    math.exp(value) --计算以e为底x次方值
    math.frexp(num) – 返回当前数字小数点后的数值以及小数点后的位数
    math.ldexp(v
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值