目录

Lua学习

Lua简介

Lua 是一门非常之小,但五脏俱全的动态语言。它由 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes在1993年创建。Lua 拥有一组精简的强大特性,以及容易使用的 C API ,这使得它易于嵌入与扩展来表达特定领域的概念。Lua在专有软件界声名显赫。例如,在诸多游戏中,比如 Blizzard(暴雪)公司的《魔兽世界》和 Crytek GmbH 公司的《孤岛危机》,还有 Adobe 的 Photoshop Lightroom ,都使用它来作脚本 和 UI 方面的工作。它继承了 Lisp 和 Scheme,或许还有 AWK 的血脉 ; 在设计上类似于 JavaScript、Icon 和 Tcl。

Lua 将简洁的过程式语法和基于关联数组、可扩展语义的数据描述语法结构结合了起来。 Lua 是动态类型的语言,它使用基于寄存器的虚拟机解释和运行字节码(bytecode),并 使用增量垃级回收(incremental garbage collection)机制自动管理内存。这些特点使 得 Lua 很适合用于配置、脚本化和快速构造原型的场景。

Lua 是第一个由第三世界国家(巴西)开发者开发的流行度很高的语言(and the leading scripting language in games)。

Lua 解释器只有 2w+ 多行 ANSI C/C++ 代码, 可执行文件 200+ KB 大小。

Lua语法

-- 一个函数
function fact (n)
    if n < 0 then
        print("不能输入负数!")
        return
    end
    if n == 0 then
        return 1
    else
        return n * fact(n-1)
    end
end
--[[
  这个是多行注释  
]]
-- 这也是一种注释方法 如果使用下面的代码可以将行首的-- 变为 ---
--[[
    print(fact(3))
--]] 

print("enter a number")
-- 局部变量 默认为全局变量
local a = io.read("*n")
print(fact(a))
--打印脚本的名字
print(arg[0])

Lua语言是一种动态类型语言Dynamically-typed language),在这种 语言中没有类型定义type definition),每个值都带有其自身的类型信 息。 Lua语言中有8种基本类型:nil (空)boolean (布尔)number (数值)string (字符串)userdata (用户数据)function (函 数)thread(线程table(表)。使用函数type可获取一个值对应的 类型名称:

> type(nil)
nil
> type(false)
boolean
> type(3)
number
> type(4.0)
number
> type("hi")
string
> type(io.stdin)
userdata
> type(print)
function
> type(type)
function
> type({})
table
> type(type(X))
string

userdata类型允许把任意的C语言数据保存在Lua语言变量中。在Lua语言中,用户数据类型除了赋值和相等性测试外,没有其他预定义的操作。用 户数据被用来表示由应用或C语言编写的库所创建的新类型。例如,标准I/O库使用用户数据来表示打开的文件。

Lua独立解释器

独立解释器Stand-alone interpreter,由于源文件名为lua.c,所以也 被称为lua.c;又由于可执行文件为lua,所以也被称为lua)是一个可以直接 使用Lua语言的小程序。这一节介绍它的几个主要参数。

如果源代码文件第一行以井号(#)开头,那么解释器在加载该文件时 会忽略这一行。这个特征主要是为了方便在POSIX系统中将Lua作为一种脚 本解释器来使用。假设独立解释器位于/usr/local/bin下,当使用下列脚 本:

#!/usr/local/bin/lua

或者

#!/usr/local/env lua

时,不需要显式地调用Lua语言解释器也可以直接运行Lua脚本。 lua命令的完整参数形如:

lua命令的完整参数为:

lua [option] [script [args]]

其中,所有的参数都是可选的。如前所述,当不使用任何参数调用lua 时,就会直接进入交互模式。

-e参数允许我们直接在命令行中输入代码,例如:

> lua -e "print(math.sin(12))"
-0.53657291800043

-l参数用于加载库。正如之前提到的那样,-i参数用于在运行完其他命令 行参数后进入交互模式。因此,下面的命令会首先加载lib库,然后执行 x=10的赋值语句,并最终进入交互式模式: