无标题作品te

图片 1全局环境.jpg

本文所有内容全部都是我在阅读了《Programming in
Lua》这本书之后整理出来的,可以理解本文为一个快速查询的“手册”,因此并不适合零基础的读者。入门学习的话,还是建议先看看《Programming
in
Lua》这本书。本文并未包含所有的Lua语法,并不是Lua语法大全。很多高级特性,相信在你用到的时候,以下内容肯定都已经了然于心了,不再需要这种入门级的小手册了。
另外,今天是愚人节!但是我并不想骗你们!以下内容并不是愚人节的礼物,如果踩到坑,恕我无心。

今天来看一个Lua中的一个非常重要的全局变量_G,这个变量可以说是Lua中最重要的一个变量了,其中保存了lua语言中几乎所有的全局函数和变量,那究竟这个变量有什么用呢,我们可以通过例子来了解一下。

关于Lua语言的一些基本常识

  • Chunk 是一系列语句,Lua
    执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个
    Chunk。一个 Chunk
    可以是一个语句,也可以是一系列语句的组合,还可以是函数,Chunk可以很大,在
    Lua 中几个 MByte 的 Chunk 是很常见的。
  • 每个语句结尾的分号(;)是可选的,但如果同一行有多个语句最好用;分开
  • 命令lua -la -lb首先在一个 Chunk 内先运行 a 然后运行 b。(注意:-l
    选项会调用
    require,将会在指定的目录下搜索文件,如果环境变量没有设好,上面的命令可能不能正确运行。)
  • lua -i -la -lb,-i 选项要求 Lua 运行指定 Chunk 后进入交互模式.
  • dofile 函数加载文件并执行它
  • 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil.当且仅当一个变量不等于
    nil 时,这个变量存在。
  • Lua 是大小写敏感的.
  • 单行注释:– 注释内容
  • 多行注释:–[[ 注释内容,这里可以有多行。 –]]
  • 可以直接通过命令参数传入Lua语句。prompt> lua -e
    “print(math.sin(12))” –> -0.53657291800043 -e:直接将命令传入 Lua
  • 全局变量 arg 存放 Lua 的命令行参数。
  • 原型:_G
  • 解释:首先要注意的是,_G是一个变量而不是一个函数,它掌控了整个全局环境(其中_G._G = _G)。Lua语言本身并不使用这个变量,改变这个变量的值也不会对运行环境产生影响(使用函数setfenv()
    可以改变运行环境)。

类型和值

  • Lua 是动态类型语言,变量不要类型定义。 Lua 中有 8 个基本类型分别为:
    nil、boolean、number、string、userdata、function、thread 和
    table。函数 type 可以测试给定变量或者值的类型。
  • 关于布尔值需要注意:Lua
    中所有的值都可以作为布尔值来用。在控制结构的条件中除了 false 和 nil
    为假,其他值都为真。Lua 认为 0 和空串都是真。
  • 可以使用单引号或者双引号表示字符串
  • 除了双引号和单引号,还可以使用[[…]]表示字符串。这种形式的字符串可以包含多行,可以嵌套且不会解释转义序列,如果第一个字符是换行符会被自动忽略掉。这种形式的字符串用来包含一段代码是非常方便的。
  • 运行时,Lua 会自动在 string 和 numbers
    之间自动进行类型转换,当一个字符串使用算术操作符时,string
    就会被转成数字。反过来,当 Lua 期望一个 string
    而碰到数字时,会将数字转成 string。
  • ..在 Lua
    中是字符串连接符,当在一个数字后面写..时,必须加上空格以防止被解释错。print(10
    .. 20) –> 1020

表达式和运算符

  • Lua中不等号是~=
  • 如果两个值类型不同,Lua 认为两者不同;nil 只和自己相等。Lua
    通过引用比较
    tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
  • Lua
    比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。
  • Lua的逻辑运算符是 and or not
  • list 风格初始化和 record 风格初始化是[expression]一般初始化的特例
  • Lua数组下标从1开始
  • 首先我们新建一个文件将文件命名为_Gtest.lua然后编写代码如下:

基本语法

  • Lua
    可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。a,b
    = 10, 2x <–> a=10;
    b=2
    x。多值赋值经常用来交换变量,或将函数调用返回给变量:a, b = f()
  • 遇到赋值语句 Lua
    会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:x,
    y = y, x。变量个数 > 值的个数 按变量个数补足 nil,变量个数 <
    值的个数 多余的值会被忽略。
  • 使用local
    创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个
    chunk(变量被声明的那个文件或者文本串)。
  • do..end(相当于 c/c++的{})

流程控制语句

-- 先输出一下函数是否存在print("print_message = ", tostring(_G["print_message"]))-- 先写一下全局函数function print_message print("Lua output : "..str)end-- 再输出一下函数是否存在print("print_message = ", tostring(_G["print_message"]))-- 调用函数local func = _G["print_message"]func("print_message function is exist!")-- 定义局部函数local function local_name() print("Lua output : this is local functon")end-- 检查一下局部函数是否存在print("local_name = ", tostring(_G["local_name"]))_G["local_name"] = local_name;-- 调用就已经变成全局函数的局部函数_G["local_name"]()

条件

if conditions then
    print("hello elvin!");
end;

if conditions then
    print("hello elvin!");
else
    print("hello elvin!");
end;

if conditions then
    print("hello elvin!");
elseif conditions then
    print("hello elvin!");
    -- 多个elseif
else
    print("hello elvin!");
end
  • 运行结果

循环

发表评论

电子邮件地址不会被公开。 必填项已用*标注