【在主画面加入捷径】
       
【选择语系】
繁中 简中

Lua 程序设计教学:变量 (Variable) 和数据类型 (Data Type)

【赞助商连结】

    注解 (Comments)

    在程序中,注解的部分不会执行,程序设计者可在注解中加入一般文字。注解的用途在于记录当下撰写程序的想法或意图,以利之后修改程序时可较快回复记忆。Lua 中撰写注解的方式如下:

    • -- ...:单行注解
    • --[[ ... --]]:多行注解

    变量 (Variables)

    电脑程序时常需要操作数据 (data) 以达成特定功能,在程序中,变量 (variable) 是数据的标签,Lua 程序透过变量可以存取数据。以下变量 msg 储存字串 Hello World,再由 print函数来调用:

    msg = "Hello World"
    print(msg)

    函式 (function) 是预先写好的程序区块,需要时调用即可使用。print 是 Lua 内建的函式,可将数据转为字串印出。

    Lua 的变量没有绑定特定的类型 (data type),类型由值本身决定:

    var = "Hello World"
    assert(type(var) == "string")
    
    var = 12345
    assert(type(var) == "number")

    在这里,我们使用两个内建函式,assert 会断定函式内的值是否为真,不为真时会中止程序,type 会回传变量的类型,回传的值本身为字串。

    Lua 比较大的问题在于其变量默认是全局变量 (global variable),而全局变量的有效范围会超过单一的 Lua 脚本,当程序规模变大时,这项特性很容易造成程序中难以发现的臭虫 (bug)。比较好的方式是用 local 声明局部变量 (local variable):

    local msg = "Hello World"
    print(msg)

    使用 local 声明的变量,其可视度 (scope) 不会超出该 Lua 脚本,减少程序出现 bug 的机会。

    如果在同一个文件内要隔离变量的可视局部,可用 do ... end 区块,该区块可跨越多行:

    do
      -- Do something here.
    end

    数据类型 (Data Types)

    如同大部分的程序语言,Lua 的值具有类型,类型规范可用的操作,像是数字可以加减乘除、布林可以进行布林运算等。Lua 包括以下八种数据类型:

    • nil
    • 布林 (boolean)
    • 数字 (number)
    • 字串 (string)
    • 表 (table) *函数 (function)
    • thread
    • userdata

    我们将简要地说明这八种类型。

    Nil

    Lua 用 nil 表示没有值,在变量未设置其他值时,该变量的的值即为 nil。将变量设为 nil 即可以删除此变量。

    布林 (Boolean)

    布林 (boolean) 包括 truefalse,用于逻辑判断。要注意的是,Lua 的值除了 falsenil 外皆为 true,像是零、空字串、空 table 等皆视为 true,故不能用空值做为 false (伪),这和 C 语言略有不同。

    数字 (Numbers)

    在 5.3 版以前,Lua 的数字皆为倍精度浮点数 (double-precision floating-point),没有整数 (integer);5.3 版后引入整数类型。在进行数字运算时,若有使用小数点的部位,需注意可能的误差。在以下程序中,程序会因一些微小的误差引发错误:

    -- Error
    assert(0.1 + 0.2 - 0.3 == 0.0)
    

    Lua 的数字可用十进位数或十六进位数表示,例如 0xff

    字串 (Strings)

    Lua 字串是 byte 数组,没有限定特别的编码,甚至可以存二进元数据。从 5.3 版起,Lua 另外有处理 UTF-8 编码字串的小型函式库。Lua 对于字串处理能力相对薄弱,也没有内建的常规表示式 (regular expression)函数库。

    Lua 是弱类型语言,字串和数字会自动转换,如下例:

    -- Convert numbers to strings.
    assert((10 .. 20) == "1020")
    
    -- Convert strings to numbers.
    assert(("10" + 1) == 11)
    

    表 (Table)

    表是 Lua 唯一的数据结构,内部为关连式数组 (associative array)。Table 在 Lua 相当重要,除了用来做为数据结构外,也是 Lua 面向对象程序的基础。我们将于后续文章讨论表和面向对象程序。

    ###函数 (Function)

    Lua 的函式除了用来包装程序代码区块外,也可做为值使用,也就是说,Lua 可以撰写函数式程序。我们将于后续文章介绍函式和函数式程序。

    Thread

    Lua 缺乏真正的多线程,而以 coroutine 做为协同式多工。

    Userdata

    Userdata 主要是用来和宿主程序沟通。传统上,宿主程序是 C (或 C++),不过也可能是其他的程序语言。

    【赞助商连结】