0
点赞
收藏
分享

微信扫一扫

命名管道详解

GG_lyf 2023-06-08 阅读 106
Lua

前言:

-->  表示一条语句的输出或表达式求值的结果

--  单行注释

> 标注  一些代码需要在交互模式下输入

=  如果需要打印表达式求值的结果,必须在每个表达式前加上一个等号

<-->  表示两者完全等价

语言基础

我们将Lua语言执行的每一段代码(例如,一个文件或交互模式下的一行)称为一个程序段(Chunk),即一组命令或表达式组成的序列。

Lua语言中的标识符(或名称)是由任意字母[插图]、数字和下画线组成的字符串(注意,不能以数字开头

“下画线+大写字母”(例如_VERSION)组成的标识符通常被Lua语言用作特殊用途,应避免将其用作其他用途

 Lua语言对大小写敏感

 在注释一段代码时,一个常见的技巧是将这些代码放入--[[和--]]之间

当我们需要重新启用这段代码时,只需在第一行行首添加一个连字符即可:

 Lua中 分号是可选的,连续语句之间的分隔符并不是必须的,如果需要的话可以用分号来进行分隔,表达式之间的换行不起任何作用,一下4个程序段都是合法且等价的

 全局变量

Lua中的变量默认都是全局变量,即使是函数体中声明的

使用未经初始化的全局变量也不会导致错误,当使用未经初始化的全局变量时得到的结果是nil

(类似于null的东西

当把nil赋值给全局变量时,Lua会回收该全局变量(就像该全局变量从来没有出现过一样)

Lua语言不区分未初始化变量和被赋值为nil的变量,当一个变量被赋值为nil时Lua语言最终会收回该变量占用的内存

类型的值

Lua语言是一种动态类型语言(Dynamically-typed language),在这种语言中没有类型定义(type definition),每个值都带有其自身的类型信息。

Lua语言中有8种基本类型:nil(空)、boolean(布尔)、number(数值)、string(字符串)、userdata(用户数据)、function(函数)、thread(线程)和table(表)。使用函数type可获取一个值对应的类型名称

 userdata类型允许把任意的C语言数据保存在Lua语言变量中。在Lua语言中,用户数据类型除了赋值和相等性测试外,没有其他预定义的操作

变量没有预定义的类型,任何变量都可以包含任何类型的值

nil

nil是一种只有一个nil值的类型,它的主要作用就是与其他所有值进行区分。Lua语言使用nil来表示无效值(non-value,即没有有用的值)的情况。像我们之前所学习到的,一个全局变量在第一次被赋值前的默认值就是nil,而将nil赋值给全局变量则相当于将其删除。

Boolean

Boolean类型具有两个值,true和false,它们分别代表了传统布尔值。不过,在Lua语言中,Boolean值并非是用于条件测试的唯一方式,任何值都可以表示条件。在Lua语言中,条件测试(例如控制结构中的分支语句)将除Boolean值false和nil外的所有其他值视为真。特别的是,在条件检测中Lua语言把零和空字符串也都视为真。

and,or,not

逻辑运算符and的运算结果为:如果它的第一个操作数为“false”,则返回第一个操作数,否则返回第二个操作数。

逻辑运算符or的运算结果为:如果它的第一个操作数不为“false”,则返回第一个操作数,否则返回第二个操作数

 and 和 or 都遵循短路求值原则

and  的运算符优先级 高于 or

not 还是取反符号,永远返回Boolean类型的值

独立解释器

数值

数值常量

Lua语言为数值格式提供了两种选择:被称为integer的64位整型和被称为float的双精度浮点类型

具有十进制小数或者指数的数值会被当作浮点型值,否则会被当作整型值。

整型值和浮点型值的类型都是"number"

 由于整型值和浮点型值的类型都是"number",所以它们是可以相互转换的。同时,具有相同算术值的整型值和浮点型值在Lua语言中是相等的

在少数情况下,当需要区分整型值和浮点型值时,可以使用函数math.type:

 

 算术运算

所有的算术操作符不论操作整型值还是浮点型值,结果都应该是一样的。

两个整型值进行相加、相减、相乘、相除和取负操作的结果仍然是整型值。对于这些算术运算而言,操作数是用整型还是用浮点型表示的整数都没有区别

如果两个操作数都是整型值,那么结果也是整型值;否则,结果就是浮点型值。当操作数一个是整型值一个是浮点型值时,Lua语言会在进行算术运算前先将整型值转换为浮点型值

 为了避免两个整型值相除和两个浮点型值相除导致不一样的结果,除法运算操作的永远是浮点数且产生浮点型值的结果:

floor除法运算符

Lua 5.3针对整数除法引入了一个称为floor除法的新算术运算符//。顾名思义,floor除法会对得到的商向负无穷取整,从而保证结果是一个整数。这样,floor除法就可以与其他算术运算一样遵循同样的规则:如果操作数都是整型值,那么结果就是整型值,否则就是浮点型值(其值是一个整数)。

 如果操作数是整数,那么取模运算的结果也是整数。因此,取模运算也遵从与算术运算相同的规律,即如果两个操作数均是整型值,则结果为整型,否则为浮点型。其结果的符号永远与第二个操作数的符号保持一致。特别地,对于任意指定的正常量K,即使x是负数,表达式x%K的结果也永远在[0,K-1]之间。例如,对于任意整型值i,表达式i%2的结果均是0或1。

 幂运算

使用符号^表示。像除法一样,幂运算的操作数也永远是浮点类型(整型值在幂运算时不能整除,例如,2-2的结果不是整型值)。我们可以使用x^0.5来计算x的平方根,使用x^(1/3)来计算x的立方根。

关系运算

 

 ==用于相等性测试,~=用于不等性测试。这两个运算符可以应用于任意两个值,当这两个值的类型不同时,Lua语言认为它们是不相等的;否则,会根据它们的类型再对两者进行比较。

比较数值时应永远忽略数值的子类型,数值究竟是以整型还是浮点型类型表示并无区别,只与算术值有关(尽管如此,比较具有相同子类型的数值时效率更高)。

数学库

Lua语言提供了标准数学库math。标准数学库由一组标准的数学函数组成,包括三角函数(sin、cos、tan、asin等)、指数函数、取整函数、最大和最小函数max和min、用于生成伪随机数的伪随机数函数(random)以及常量pi和huge(最大可表示数值,在大多数平台上代表inf)。

所有的三角函数都以弧度为单位,并通过函数deg和rad进行角度和弧度的转换。

随机数发生器

函数math.random用于生成伪随机数,共有三种调用方式

当不带参数调用时,该函数将返回一个在[0,1)范围内均匀分布的伪随机实数。

当使用带有一个整型值n的参数调用时,该函数将返回一个在[1,n]范围内的伪随机整数

当使用带有两个整型值l和u的参数调用时,该函数返回在[l,u]范围内的伪随机整数。

函数randomseed用于设置伪随机数发生器的种子

该函数的唯一参数就是数值类型的种子。在一个程序启动时,系统固定使用1为种子初始化伪随机数发生器。如果不设置其他的种子,那么每次程序运行时都会生成相同的伪随机数序列。从调试的角度看,这是一个不错的特性,然而,对于一个游戏来说却会导致相同的场景重复不断地出现。为了解决这个问题,通常调用math.randomseed(os.time())来使用当前系统时间作为种子初始化随机数发生器

取整函数

数学库提供了三个取整函数:floor、ceil和modf

floor向负无穷取整,ceil向正无穷取整,modf向零取整。当取整结果能够用整型表示时,返回结果为整型值,否则返回浮点型值

 表示范围

对于浮点数而言,标准Lua使用双精度。标准Lua使用64个比特位表示所有数值,其中11位为指数。双精度浮点数可以表示具有大致16个有效十进制位的数,范围从-10308到10308。精简Lua使用32个比特位表示的单精度浮点数,大致具有7个有效十进制位,范围从-1038到1038。

浮点型能够表示的整数范围被精确地限制在[-253,253]之间(不过这个范围已经很大了)。在这个范围内,我们基本可以忽略整型和浮点型的区别;超出这个范围后,我们则应该谨慎地思考所使用的表示方式。

惯例

我们可以简单地通过增加0.0的方法将整型值强制转换为浮点型值,一个整型值总是可以被转换成浮点型值

小于253(即9007199254740992)的所有整型值的表示与双精度浮点型值的表示一样,对于绝对值超过了这个值的整型值而言,在将其强制转换为浮点型值时可能导致精度损失:

通过与零进行按位或运算,可以把浮点型值强制转换为整型值

在将浮点型值强制转换为整型值时,Lua语言会检查数值是否与整型值表示完全一致,即没有小数部分且其值在整型值的表示范围内,如果不满足条件则会抛出异常

对小数进行取整必须显式地调用取整函数。

另一种把数值强制转换为整型值的方式是使用函数math.tointeger,该函数会在输入参数无法转换为整型值时返回nil

十六进制的浮点常量包含前导的0x或0X,在后面紧跟一个或多个十进制或十六进制数字,然后紧接着是p或P,最后是可以带符号的二进制指数。例如,0x0.3p10表示的值为3/16 × 2的10次方=192 

 运算符优先级

优先级从高到低

 字符串

 在Lua语言中,字符使用8个比特位来存储

像Lua语言中的其他对象(表、函数等)一样,Lua语言中的字符串也是自动内存管理的对象之一。这意味着Lua语言会负责字符串的分配和释放,开发人员无须关注。

使用长度操作符(length operator)(#)获取字符串的长度

使用连接操作符..(两个点)来进行字符串连接

应该注意,在Lua语言中,字符串是不可变量。字符串连接总是创建一个新字符串,而不会改变原来作为操作数的字符串

字符串常量

Lua语言中的字符串支持下列C语言风格的转义字符

 长字符串/多行字符串

[===[    ]===]    [==[  ]==],在括号中包含不同数量的等号来达成嵌套包含,以防注释代码等的符号造成混乱

像长注释/多行注释一样,可以使用一对双方括号来声明长字符串/多行字符串常量。被方括号括起来的内容可以包括很多行,并且内容中的转义序列不会被转义

 强制类型转换

Lua语言在运行时提供了数值与字符串之间的自动转换

当Lua语言发现在需要字符串的地方出现了数值时,它就会把数值转换为字符串:

当在数值后紧接着使用字符串连接时,必须使用空格将它们分开,否则Lua语言会把第一个点当成小数点。

算术运算的规则就是只有在两个操作数都是整型值时结果才是整型。因此,由于字符串不是整型值,所以任何有字符串参与的算术运算都会被当作浮点运算处理:

如果需要显式地将一个字符串转换成数值,那么可以使用函数tonumber。当这个字符串的内容不能表示为有效数字时该函数返回nil

 默认情况下,函数tonumber使用的是十进制,但是也可以指明使用二进制到三十六进制之间的任意进制:

 为了避免出现不一致的结果,当比较操作符中混用了字符串和数值(比如2<"15")时,Lua语言会抛出异常

字符串标准库

string.len(s) 返回字符串s的长度,等价于#s

函数string.sub(s,i,j)从字符串s中提取第i个到第j个字符(包括第i个和第j个字符,字符串的第一个字符索引为1),该函数也支持负数索引,负数索引从字符串的结尾开始计数,索引-1代表字符串的最后一个字符

 函数string.charstring.byte用于转换字符及其内部数值表示。函数string.char接收零个或多个整数作为参数

 函数string.format,这不就是prinft?

是用于进行字符串格式化和将数值输出为字符串的强大工具,该函数会返回第一个参数(也就是所谓的格式化字符串(format string))的副本,其中的每一个指示符(directive)都会被替换为使用对应格式进行格式化后的对应参数。格式化字符串中的指示符与C语言中函数printf的规则类似,一个指示符由一个百分号和一个代表格式化方式的字母组成

d代表一个十进制整数、x代表一个十六进制整数、f代表一个浮点数、s代表字符串

 

 

 

 

 

举报

相关推荐

0 条评论