Lua基本语法

1 简介

由 clean C 实现。需要被宿主程序调用,可以注入 C 函数。

2 语法约定

Lua 的语法基于 BNF 的语法规则。

Lua 对大小写敏感。

2.1 保留关键字

C 语言中没有的关键字有:

代码如下:

and elseif function
in nil local not or
repeat then until

规范:全局变量以下划线开头。

2.2 操作符

C 语言中没有的操作符:

^
~=
//  -- 向下取整
Lua 中没有的操作符:

+=
-=

2.3 字符串定义

采用转义符:通过转义符表示那些有歧义的字符

字符表示

a           -- 代表字符 a
\97         -- 代表字符 a
\049        -- 代表数字字符 1
其他转义符表示

\\n         -- 代表字符串 \n
\n          -- 代表换行
注意数字字符必须是三位。其他字符则不能超过三位。

采用长括号:长括号内的所有内容都作为普通字符处理。

[[]]        -- 0级长括号
[==[]==]    -- 2级长括号

3 值与类型

Lua 是动态语言,变量没有类型,值才有。值自身携带类型信息。

Lua 有八种基本数据类型:nil, boolean, number, string, function, userdata, thread, table。

仅 nil 和 false 导致条件为假,其他均为真。

userdata 类型变量用于保存 C 数据。 Lua 只能对该类数据进行使用,而不能进行创建或修改,保证宿主程序完全掌握数据。

thread 用于实现协程(coroutine)。

table 用于实现关联数组。table 允许任何类型的数据做索引,也允许任何类型做 table 域中的值(前述
任何类型 不包含 nil)。table 是 Lua 中唯一的数据结构。
由于函数也是一种值,所以 table 中可以存放函数。

function, userdata, thread, table 这些类型的值都是对象。这些类型的变量都只是保存变量的引用,并且在进行赋值,参数传递,函数返回等操作时不会进行任何性质的拷贝。

库函数 type() 返回变量的类型描述信息。

3.1 强制转换

Lua 提供数字与字符串间的自动转换。
可以使用 format 函数控制数字向字符串的转换。

4 变量

变量有三种类型:全局变量、局部变量、表中的域。

函数外的变量默认为全局变量,除非用 local 显示声明。函数内变量与函数的参数默认为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。

变量的默认值均为 nil。

代码如下:

a = 5               -- 全局变量
local b = 5     -- 局部变量
function joke()
    c = 5           -- 局部变量
    local d = 6 -- 局部变量
end
print(c,d)      --> nil nil
do
    local a = 6 -- 局部变量
    b = 6           -- 全局变量
    print(a,b); --> 6 6
end
print(a,b)      --> 5 6

方便标记,--> 代表前面表达式的结果。

4.1 索引

对 table 的索引使用方括号 []。Lua使用语法糖提供 . 操作。

t[i]
t.i                 -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用

4.2 环境表

所有全局变量放在一个环境表里,该表的变量名为 _env 。对某个全局变量 a 的访问即 _env.a (_env_ 只是为了方便说明)。

每个函数作为变量持有一个环境表的引用,里面包含该函数可调用的所有变量。
子函数会从父函数继承环境表。
可以通过函数 getfenv / setfenv 来读写环境表。

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • Lua中的基本语法、控制语句总结

    前言 学习一门语言,首先就是从最基本的语法开始,这一篇将对Lua中的语句进行概要的总结. 赋值 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许"多重赋值",也就是一下子将多个值赋予多个变量,例如以下代码: 复制代码 代码如下: local x1, x2 = 2, 4 print(x1)     -->2 print(x2)     -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值

  • Lua教程(二):语法约定

    Lua 中用到的 名字(也称作 标识符)可以是任何非数字开头的字母.数字.下划线组成的字符串. 这符合几乎所有编程语言中关于名字的定义. (字母的定义依赖于当前环境:系统环境中定义的字母表中的字母都可以被用于标识符.) 标识符用来命名变量,或作为表的域名. 下面的关键字是保留的,不能用作名字: 复制代码 代码如下: and       break     do        else      elseif end       false     for       function  if i

  • Lua简介、编译安装教程及变量等语法介绍

    公司业务有用到Lua,与nginx结合起来实现高性能的web应用,想去弄懂这方面的知识,就去了解学习了下Lua,欢迎大咔们指教. 1. Lua介绍 Lua是一门简单的编程语言,它的优势在于可以整合C++的模块来扩展自身的功能,使用数百行或更少的代码来解决复杂的问题.具有的特征有: 1.1. 可扩展性:Lua从一开始就被设计成易于扩展的语言,很多功能都是通过外部库来实现的,很容易与其他编程语言如C.C++.Java等等进行交互. 1.2. 简洁: Lua十分简洁,但是功能强大,易于学习,很适合小规

  • ubuntu 14.04下熟悉lua的语法

    随着lua越来越成熟,在服务器中应用也越来越广.自己也想向这方面发展,于是便开始lua的学习. 学习新的语言,应该是先编译.安装.部署开发调试环境,然后练习...可是,我现在并没有项目做啊,我只是想先熟悉一下lua的语法,没必要这么复杂.于是便开始找个简单的lua IDE.挑来挑去,选了个 ZeroBrane Studio ,原因是它小巧,可以单步调试.另外,在linux下也不是有那么多的选择的,我可不想刚开始学就用个sublime text写个xxx.lua再到shell去执行lua xxx.

  • Lua基本语法

    1 简介 由 clean C 实现.需要被宿主程序调用,可以注入 C 函数. 2 语法约定 Lua 的语法基于 BNF 的语法规则. Lua 对大小写敏感. 2.1 保留关键字 C 语言中没有的关键字有: 复制代码 代码如下: and elseif function in nil local not or repeat then until 规范:全局变量以下划线开头. 2.2 操作符 C 语言中没有的操作符: ^ ~= //  -- 向下取整 Lua 中没有的操作符: += -= 2.3 字符

  • Lua函数用法研究

    在Lua 基本语法快速入门中有涉及到函数的用法,但只是普通的应用,并没有深成次的研究一下,介于函数用的还是比较多的就专门做个专题研究一下~    一.函数.变量的用法 函数的定义用关键字function .然后加函数名和变量.注意后面没有do.最后以end结束. 在函数中的变量默认是全局变量,但通常情况下函数中的变量都是在函数中有效的.所以要在声明的时候加上"local" 标明只在局部有效. 二.返回多个结果值 在Lua中的函数可以返回多个返回值.这与C等语言有很大的不同.因为从根本上

  • 获取Lua表结构(table)数据实例

    只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lua表结构的数据. (旁白:O O!我是不是该说点什么?) 上一章传送门:http://www.jb51.net/article/55093.htm 1. 什么是table table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度. (旁白:那你还写什么教程...) 2. 获取table变量 现在,我们给helloLua

  • Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    Lua脚本,以前我不知道它有多强大,但是当我做了1年的手机网游之后,起码我发现了,更新客户端是一件很恐怖的事情(会导致大量玩家的流失,以及有一个漫长并且惊心动魄的审核过程),太扯了.于是,如果可以只更新脚本,那就不需要玩家重新下载客户端了,直接在线更新,嗯嗯,虽然我发现了这个,但是还没有实现.噗,代码写烂了,不好改.   所以啊,我已经做好准备了,如果下次用cocos2d-x开发,lua不可少啊~!   看看官方的例子吧,先来AppDelegate.cpp的applicationDidFinis

  • Lua教程(一):在C++中嵌入Lua脚本

    本系列教程主要介绍如何在C/C++程序里面嵌入Lua脚本,我打算从以下几个方面来介绍: 1.如何在C/C++里面嵌入Lua脚本 2.Lua访问C/C++数据结构(这里面要介绍类,结构体,函数,变量,枚举等数据类型在lua里面如何访问) 3.C/C++访问Lua的数据,主要是基本数据类型,函数和Table 4.Cocos2D-X里面的Lua绑定(含自动绑定与手动绑定) 5.Cocos2D-x里面Lua和C/C++相互调用 6.Cocos2D-x里面Lua和Java相互调用 7.Cocos2D-x里

  • 利用Lua定制Redis命令的方法详解

    前言 Redis作为一个非常成功的数据库,提供了非常丰富的数据类型和命令,使用这些,我们可以轻易而高效地完成很多缓存操作,可是总有一些比较特殊的问题或需求需要解决,这时候可能就需要我们自己定制自己的 Redis 数据结构和命令. Redis命令问题 线程安全问题 我们都知道 Redis 是单线程的,可是它怎么会有 线程安全 问题呢? 我们正常理解的线程安全问题是指单进程多线程模型内部多个线程操作进程内共享内存导致的数据资源充突.而 Redis 的线程安全问题的产生,并不是来自于 Redis 服务

  • 详解Redis中Lua脚本的应用和实践

    引言 前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重.后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正. redis lua 脚本相关命令 这一小节的内容是基本命令,可粗略阅读后跳过,等使用的时候再回来查询 redis 自 2.6.0 加入了 lua 脚本相关的命令,EVAL.EVALSHA.SCRIPT EXISTS.SCRIPT FLUSH.SCRIPT KILL.SCRIPT LOAD,

  • Nginx使用Lua模块实现WAF的原理解析

    目录 一.WAF产生的背景 二.什么是WAF 三.工作原理 四.WAF作用 五.WAF和传统防火墙的区别 六.WAF和DDos 七.Nginx WAF功能 八.Nginx Waf防护流程 九.基于Nginx实现的WAF 9.1安装依赖包 9.2安装LuaJIT2.0 9.3安装ngx_devel_kit 9.4安装lua-nginx-module 9.5安装Nginx 9.6安装ngx_lua_waf 9.7测试效果 前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了

随机推荐