`
avenje
  • 浏览: 13480 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

(3)LUA程序设计-表达式与语句(expression & statement)

 
阅读更多

1.表达式

lua的表达式,一般由数字/字符串常量,一元/二元运算符,函数调用构成,除此外,lua表达式当中还可以有函数定义和table构造式

1.1算术运算符

一目运算符只有-负号,二元运算符有+ - * / %加减乘除求余,在这里特别说明一下求余运算,规则如下

a%b = a - floor(a/b)*b

对于整数求余,表达式结果符号与b一致;对于实数而言,如x%1表示x的小数部分;x%0.1表示保留x的小数点一位之后的值(如3.123%0.1 = 0.023);x%0.01表示保留x小数点两位之后的值(如3.123%0.01 = 0.003)

1.2关系操作符

> < <= >= == ~= 操作结果只有true/false两种值;

只有类型相等的两个值,才有可能==,nil只有与自身相等,其他一律不相等

function/userdata/table只有引用相等时,才相等 ,否则不相等,下面举table为例

a = {} a.x = 0 a.y = 0

b = {} b.x = 0 b.y =0

c = a

print(a==b) -->false

print(c==a) -->true

lua中两个字符串的比较,像C语言一样逐位比较,如"abcd" <"dbcd"

区别: 0与“0”,由于不同类型,所以~=

   我们都知道12<15为true,但是'12'<'15'则为false,原因上面已经说了。

  1.3逻辑操作符

     and or not与或非

    逻辑操作符将false与nil视为假,其他一律视为真

    lua的逻辑运算与其他语方的逻辑运算不一样,在明确知道逻辑运算的结果的情况下,该逻辑运算表达式将以其中一个操作数作为结果,规则如下

     a and b --a,b为两个表达式,a为假,刚逻辑表达式结果肯定为假,此时,整个表达式的结果为a,否则为b

a or b --a,b 同上,a为真的时候,这个表达式结果肯定为真,此时返回a作为表达式结果,否则返回b

技巧:1.if not x then x = v end <==> x = x or v(与javascript语法一样)

     2. x > y ?x :y <==> (x>y) and x or y

not 很简单,取反即可。

  1.4 字符串连接符与表达式运算的优先级问题

    在(1)当中,我们简单谈到字符串连接符..的使用,在这里只需要记住,在lua当中,字符串是不可变的即可

    关于运算优先级的问题,几乎在所有的编程语言当中都提及到了,下面简扼谈一下

        ^   --指数运算

        not # --一元

        * / %

        + - 

        ..

        < > <= >= ~= ==

and

or

上面优先级从上而下,越上优先级别越高;关于结合性问题,除了指数操作符,字符串连接符是右结合外,其他都是左结合。

   1.5  table构造式

       空构造式{}

类似数组形式的构造式days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat"} --索引值从1开始,如print(days[5])-->Fri

类似于记录风格的构造式 ta = {x = 10,y = "fuck you"} 等价于 ta = {} ta.x = 10,ta.y = "fuck you"

无论用何种形式构造table,都可以在创建table之后,再为table 添加新条目,举例

        av = {x = 'cjk',y = 'sdf' ,label = 'fuck you' }

av2 = {math.sin(0),stirng.gsub('fuck you','you','him')}

av[1] = 'xzmly' --为av添加新条目key = 1 value = 'xzmly'

av2.f = av --为av2添加新条目,key = 'f',value=av(av为一个table)

再举例,从标准输入读取每一行内容,放到一个由table构建的链表当中

         list = nil

for line in io.lines() do

list = {next = list ,value = line} --创建一个表,用于存放读入的行内容,同时添加一个指向下一节点的条目next

         end

读取每一行内容

        local l = list --定义局部变量l,用于指向连表头list

while l do

print(l.value) --打印每一行内容

         l = l.next --指向下一个节点

end

说明:1.当记录与列表table混合在同一个table当中时,举例如下

           t={ x = 1,y =2 ,{a=11,b=11},{a=22,b=22},{a =33,b=33}}

       时,t[1]表示一条记录,如t[1]表示{a=11,b=11},t[2]表示{a=22,b=22},t[3]表示{a=33,b=33},

2.记录/列表table各有限制,不能用负数索引,不能用运算符当索引,但可以显示将运算符加上引号,再加上方括号构成的的字符串作为索引,如下

           operates = {['+'] ='add',['-']= 'sub',['*']= 'mul',['/']= 'div'}

3.有时候可以让table从0开始索引,以前面的days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat"}表为例

            只需修改成days = {[0]="Sun","Mon","Tue","Wen","Thu","Fri","Sat"},‘Mon’从1开始索引,其他递增

      4.可以在table的最后添加一个逗号,这是lua所允许的,形如

          days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat" }

2.语句

  2.1赋值

    多重赋值

x=1 y = 2

x,y = y,x --交换x,y的值

print(x,y) -->2 1

a,b,c = 1

print(a,b,c)-->1 nil nil

a,b,c = 1,2

print(a,b,c)-->1 2 nil

a,b,c = 1,2,3

print(a,b,c) -->1,2,3

a,b,c = 1,2,3,4

print(a,b,c)-->1,2,3 4被舍弃

总结:少补nil,多舍弃原则

后面还会讲到函数,lua支持多值返回的函数,如a,b = f();f返回值分别赋值给a,b     

   2.2局部变量与块

所谓块,可以是一个控制体内,可以是函数体内,也可以是一个程序块,定义局部变量只需要在变量前加local即可

    x = 10 --global variable

local y = 1;----local variable

特别需要注意的是,

1。当在控制体内与操作体外出现同名变量,外部是全局变量,循环体内是局部变量的时候,局部变量会屏蔽全局变量,而循环体条件内的变量引用的是全局变量,例如下

     x = 10

local i = 1

while i<x do --x为全局变量x = 10    位置1

      local x = i*2 --声明x局部变量,此时x = 2,4,6,8...屏蔽外面全局变量 位置2

     end

2。当在上例中的位置1,2之间添加一条打印,打印x的值的时候

 

     x = 10

local i = 1

while i<x do --x为全局变量x = 10    位置1

       print(x) -->10

       local x = i*2 --声明x局部变量,此时x = 2,4,6,8...屏蔽外面全局变量 位置2

     end

会打印出全局变量的值。

    2.3控制结构

      简单的罗列一下控制结构

----IF-----------------------

     if ...then..end

if ... then ...else...end

if ... then ...else if ...then....else if...then....else....end

-----WHILE---------------------------------------

while ... do ....end

repeat ... until ....

---------FOR 数字型/泛型------------------------------------------

   数字型FOR  for var = e1,e2,step do .... end --e1,e2表示初始,终止值,step表示步长,默认值为1,可选

  泛型FOR  通过迭代器来遍历所有值的,形如 for index,value in ipairs(a) do print(v) end,后面将详细讲不同的迭代器的构建

   -------------return & break----简单,不举例了--------------------------------------------------------

 

 

下一节,将讲解LUA的函数,以及对函数的深入理解!!(4)LUA程序设计-函数及深入理解(function)

 

LUA技术交流群,请加Q群:139315537,加入请注明来源。

 

 

 

梦之幻时尚睡衣纺 http://shop.paipai.com/442560143

分享到:
评论

相关推荐

    lua-nginx-module-0.10.13

    Lua-Nginx-Module,简称lua-nginx-module,是Nginx服务器的一个重要扩展模块,它将强大的Lua脚本语言集成到Nginx中,允许用户在Nginx配置文件中直接编写Lua代码,极大地增强了Nginx的功能性和灵活性。版本0.10.13是...

    lua-nginx-module-0.10.9rc7

    3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定Lua脚本的路径。例如,使用`lua_code_cache on|off`来控制Lua代码缓存策略,用`set_by_lua_file`或`access_by_lua_file`等指令执行Lua脚本。 4. **测试与...

    lua-nginx-module-master.zip

    3. **Lua API**:Nginx-Lua模块提供了丰富的API供开发者调用,包括请求和响应对象、变量、定时器、日志记录、连接池管理等。例如,`ngx.req.get_uri_args()`获取请求的查询参数,`ngx.say()`输出HTTP响应内容,`ngx....

    所有版本LUA源码

    所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...

    lua-resty-core, 新的基于 lua Nginx 模块的API.zip

    lua-resty-core, 新的基于 lua Nginx 模块的API 电子邮件名称lua-resty-core - 用于ngx_http_lua_module和/或者ngx_stream_lua_module的基于new的Lua table-内容名称状态概要说明描述先决条件API实现了r

    lua-devel-5.3.4-12.el8.aarch64

    1. **头文件**:例如 `lua.h`、`luac.h` 等,这些头文件定义了 Lua API,供 C/C++ 程序调用 Lua 的函数和结构体,以便在 C 代码中与 Lua 脚本进行交互。 2. **库文件**:`liblua.a` 或 `liblua.so` 是静态和动态...

    lua-cjson-2.1.0

    3. **速度与效率**:`lua-cjson`使用C语言编写,因此比纯Lua实现的JSON库在性能上有显著优势,特别是在处理大量数据时。 4. **安全特性**:为了避免JSON注入攻击,`lua-cjson`提供了一些安全选项,如禁止解析特定的...

    lua-resty-limit-traffic, 在 openresty/ngx_lua中,用于限制和控制流量的Lua库.zip

    lua-resty-limit-traffic, 在 openresty/ngx_lua中,用于限制和控制流量的Lua库 电子邮件名称lua-resty-limit-traffic - 用于限制和控制 openresty/ngx_lua中流量的Lua库目录名称状态概要说明描述安装工具社区服务...

    lua-resty-mongol-master已编译

    lua-resty-mongol是基于OpenResty的一个lua库,专为处理MongoDB连接和操作而设计。标题"lua-resty-mongol-master已编译"表明我们已经获取到lua-resty-mongol的最新稳定版本,并且完成了编译过程,准备在不同的操作...

    EmmyLua-AttachDebugger-1.0.0.4.zip

    EmmyLua是一款专门为Lua语言开发的强大的调试工具,它允许开发者在IntelliJ IDEA这样的集成开发环境中进行断点调试,极大地提高了Lua编程的效率和精确性。"EmmyLua-AttachDebugger-1.0.0.4.zip"是这个工具的一个特定...

    lua-devel-5.1.4-4.1.el6.x86_64.rpm

    安装nginx_lua模块时候需要先安装nginx的依赖包,安装命令rpm -ivh lua-devel-5.1.4-4.1.el6.x86_64.rpm

    lua-nginx-module.zip

    《Lua在Nginx中的应用:ngx_lua模块详解》 Lua-nginx-module,又称为ngx_lua,是一个极其重要的开源项目,它将强大的Lua脚本语言引入到Nginx服务器中,使得Nginx具备了更丰富的功能扩展能力。通过这个模块,我们...

    云风-lua源码欣赏-lua-5.21

    通过了解源文件划分,读者可以更好地理解Lua的模块化设计,而代码风格部分则有助于我们了解Lua编程的一致性和规范性。 接下来,书中讨论了Lua的虚拟机(VM)实现,包括字节码的翻译和预编译过程。这部分内容对于...

    emmylua-pr-0.3.103.vsix

    EmmyLua是一款专门为Visual Studio Code(VSCode)设计的扩展插件,专注于提供对Lua语言的强大支持。在本文中,我们将深入探讨这个名为"emmylua-pr-0.3.103.vsix"的压缩包文件,以及它与EmmyLua、VSCode和Lua编程...

    lua基础篇-流程控制语句

    Lua 基础篇 - 流程控制语句 在 Lua 编程语言中,流程控制...流程控制语句是 Lua 语言中的基础构件之一,它可以控制程序的执行流程,使程序具有灵活性和智能性。通过掌握流程控制语句,可以编写更加灵活和智能的程序。

    lua-resty-mongol_openresty连接mongoldb的lua库

    “lua-resty-mongol”是专为OpenResty设计的一个lua库,用于在OpenResty环境中与MongoDB数据库进行交互。这个库的创建是为了在高性能的Web服务中无缝集成MongoDB的数据操作功能,它允许开发者使用lua脚本直接处理...

    Lua程序设计&5.1中文手册&5.1源码

    标题中的“Lua程序设计”指的是使用Lua语言进行程序开发的方法和技巧,而“5.1中文手册”则是针对Lua 5.1版本的官方文档的中文翻译版,提供了详尽的语法说明和使用指南。“5.1源码”则意味着包含了Lua 5.1版本的原始...

    lua-nginx-module-0.10.20.tar.gz

    Lua语言以其轻量级、高效和强大的脚本能力,近年来在Web开发领域备受青睐,尤其是在Nginx服务器中,Lua与Nginx的结合使用,通过lua-nginx-module模块,实现了动态处理和扩展功能,极大地提升了Nginx的灵活性和可编程...

    lua-resty-validation, 用于Lua和OpenResty的验证库( 输入验证和筛选).zip

    lua-resty-validation, 用于Lua和OpenResty的验证库( 输入验证和筛选) lua-resty-validationlua-resty-validation 是用于Lua和OpenResty的可以扩展链接验证和过滤库。带lua-resty-validation的 Hello Worldlocal val

    lua-cjson-2.1.0-已编译

    Lua-cjson是一个为Lua语言设计的JSON(JavaScript Object Notation)编码和解码库,它在Lua环境中提供了高效且易用的JSON接口。JSON是一种轻量级的数据交换格式,广泛应用于网络服务之间的数据通信以及存储数据。Lua...

Global site tag (gtag.js) - Google Analytics