Lua 快速入门

Lua 是一门强大、快速、轻量的嵌入式脚本语言,那么我们如何才能够快速学习和掌握 Lua 语言呢?在这我将分享一下我的 Lua 快速入门经验,希望对大家有所帮助。

Lua 安装

Lua 的安装过程可以参考 Lua 官网 或云风翻译的 Lua 5.3 参考手册

在 Mac OS 上安装

  1. 从 Lua 官网下载 Lua 最新的源码,然后解压。
  2. 打开终端,并 cd 到解压后的 Lua 源码目录 lua-5.3.2/
  3. 在终端中输入 make macosx install 构建并安装 Lua。
  4. 在终端中输入 lua -v 查看 Lua 是否已经安装完成。

PS:如果你没有安装 Xcode 和命令行工具是不能使用 make 命令的。

在 Windows 上安装

下载 luaforwindows 并安装,这样 lua 的开发环境就搭建好了,安装后可以直接使用 SciTE IDE 来进行 lua 代码的编写和运行。

Lua 编辑器的选择

在这里介绍一下怎么使用 Sublime Text 来编写和运行 Lua 代码,当然你也可以使用其他文本编辑器或者 IDE 来编写和运行 Lua 代码,例如在 Windows 上你可以直接使用上面所说的 SciTE。

  1. 下载并安装 Sublime Text

  2. 打开 Sublime Text,点击菜单栏中的 Tools -> Build System -> New Build System。在新建的 untitled.sublime-build 文件中输入以下代码,并把其中的 /usr/local/bin/lua 修改为你安装 Lua 后可执行文件 lua 的路径(终端 lua 命令其实执行的也是这个文件,在 Mac OS 系统上为 /usr/local/bin/lua)。最后 ctrl + s 将文件保存为 lua.sublime-build,保存位置默认即可。你可以在 /Users/gui/Library/Application Support/Sublime Text 2/Packages/User/ 目录下找个你保存的 lua.sublime-build 文件。

{ 
    "cmd":["/usr/local/bin/lua", "$file"],
    "file_regex":"^(...*?):([0-9]*):?([0-9]*)",
    "selector":"source.lua"
}
  1. 在 Sublime Text 中新建一个文件,输入 print("hello world") 并保存为 test.lua,然后 ctrl + b 运行,这个时候我们就能在 Sublime Text 中的控制台看到输出 "hello world"。

Lua 快速入门资料

  1. Lua 官方参考手册 或云风翻译的 Lua 5.3 参考手册
  2. 书籍《Lua 程序设计》。

Lua 参考手册非常适合作为快速入门的阅读资料,对 Lua 的语法等有疑惑时查看 Lua 参考手册也能快速解惑。《Lua 程序设计》除了介绍 Lua 的语法等基础知识外,还会介绍一些 Lua 高级的用法,例如:面向对象编程(在 Lua 中怎么实现类、继承、多重继承等),所以《Lua 程序设计》也是非常值得去购买的一本书籍。

PS:在学习的过程中,建议对于不理解和有疑惑的地方参照资料自己动手编写代码并运行查看输出结果。

Lua 语法

这里主要简单介绍一下 Lua 的语法和在使用过程中特别需要注意事项,同时对 Lua 和其他一些编程语言很不一样的地方进行说明。以下的部分内容引用自:云风翻译的 Lua 5.3 参考手册 和《Lua 程序设计》。

打印

print (···)

接收任意数量的参数,并将它们的值打印到 stdout。 它用 tostring 函数将每个参数都转换为字符串。 print 不用于做格式化输出。仅作为看一下某个值的快捷方式。 多用于调试。 完整的对输出的控制,请使用 string.format 以及 io.write。

注释

Lua 中使用 -- 作为行注释,使用 --[[]] 作为块注释。

块注释的常见写法如下,这样只需要在块注释的最前面加上 “-” 即可取消整个块注释,非常实用的一个小技巧。

-- 行注释
--[[块注释]]
--[[
块注释常见技巧:只要在块注释的前面加上“-”即可取消注释
--]]

值和类型

Lua 中有八种基本类型:nilbooleannumberstringfunctionuserdata
threadtable

nil 和 false 都会导致条件判断为假;而其它任何值都表示为真。

表、函数、线程、以及完全用户数据在 Lua 中被称为 对象:变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。赋值、参数传递、函数返回,都是针对引用而不是针对值的操作,这些操作均不会做任何形式的隐式拷贝。

Lua 是一门动态类型语言。这意味着变量没有类型;只有值才有类型。语言中不设类型定义。所有的值携带自己的类型。

Lua 中所有的值都是 一等公民。这意味着所有的值均可保存在变量中、当作参数传递给其它函数、以及作为返回值。

Lua 中,函数可以保存在变量中、当作参数传递给其它函数、以及作为返回值。

局部变量和全局变量

所有没有显式声明为局部变量的变量名都被当做全局变量。在编写 Lua 代码的时候如果不是全局变量一定记得添加 local。

b = 2 -- 全局变量 b
local a = 1 -- 局部变量 a

字符串

Lua 中字符串通常使用单引号或者双引号来界定,但在某些特殊的情况下会用一对匹配的双方括号来界定一个字母字符串,就像写“块注释”那样。这种写法对于书写那种含有程序代码的字符串尤为有用。如果第一个字符是换行符,那么lua会忽略它。

在两个方括号间加上任意数量的等号,这样字符串或者注释只有遇到一个内嵌有相同数量定好的双右方括号时才会结束

page = [=[
<html>
<head>
<title>An html page</title>
</head>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
<html>
--[[
a = "one string"
b = string.gsub(a, "one", "another")
print("a =", a)
print("b =", b)
--]]
]=]

print("-- print page string -- ")
print(page)

输出结果如下图:

ipairs 和 pairs

  1. ipairs 将迭代表中的键值对(1,t[1]) ,(2,t[2]), … ,直到第一个空值。注意:是从 1 开始迭代,而不是从 0 开始迭代。
  2. pairs 能迭代表中的所有键值对,而且迭代的顺序是不保证的,每次执行迭代的顺序都可能不一样。

ipairs 通常只用于迭代序列,而 pairs 则可用于迭代所有的表。

local t = {}
t[0] = 0
t[1] = 1
t[2] = 2
t[4] = 4
t["x"] = "x"
t["y"] = "y"

print("------ ipairs ------")
for i,v in ipairs(t) do
    print(i,v)
end

print("------ pairs ------")
for k,v in pairs(t) do
    print(k,v)
end

输出如下图:

唯一的数据结构 table

表是 Lua 中唯一的数据结构,它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。对于记录,Lua 使用域名作为索引。语言提供了 a.name 这样的语法糖来替代a["name"] 这种写法以方便记录这种结构的使用。

table 构造式

  1. 列表风格构造式:{”r“, "g", "b"}
  2. 记录风格构造式:{x = 10, y = 20}
  3. 通用风格构造式:{[1] = "r", [2] = "g", [3] = "r"} {["x"] = 10, ["y"] = 20}

函数

当函数只有一个参数并且该参数是一个字符串或者 table 时,函数调用时的括号是可以省略的。

function f(t)
    print(table.concat(t, ","))
end
f{1, 2, 3}

print "Hello World" --> print("Hello World")
print [=[a multi-line
message]=]
print(type{})

取长度操作符

如果 __len 元方法没有给出,表 t 的长度只在表是一个 序列 时有定义。序列指表的正数键集等于 {1..n} ,其中 n 是一个非负整数。在这种情况下,n 是表的长度。注意这样的表 {10, 20, nil, 40} 不是一个序列,因为它有键 4却没有键 3,因此,该表的正整数键集不等于 {1..n} 集合,故而就不存在 n。注意:一张表是否是一个序列和它的非数字键无关。

取长度操作符对于不是序列(有时也称为数组、线性表)的 table 来说是无意义的。

从下面的代码的输出很明显可以看出:当 table 不是序列的时候,取长度操作符的结果是变动的、无意义的。

-- #取长度操作符,table的长度是从1算起
local t1 = {}
t1[1] = 1
t1[2] = 2
print("t1", #t1) --> 2

-- #取长度操作符,返回一个数组或线性表的最后一个索引值。
-- #取长度操作符对于不是数组或者线性表的table来说是无意义的。
local t2 = {}
t2[1] = 1
t2[2] = 2
t2[4] = 4
print("t2", #t2) --> 4

local t3 = {}
t3[1] = 1
t3[2] = 2
t3[5] = 5
print("t3", #t3) --> 2

local t4 = {}
t4[1] = 1
t4[2] = 2
t4[1000] = 1000
print("t4", #t4) --> 2

local t5 = {}
t5[1] = 1
t5[2] = 2
t5[3] = 3
t5[4] = 4
t5[7] = 7
t5[1000] = 1000
print("t5", #t5) --> 4

local t6 = {}
t6[1] = 1
t6[2] = 2
t6[3] = 3
t6[4] = 4
t6[7] = 7
t6[8] = 8
t6[1000] = 1000
print("t6", #t6) --> 8

字符串连接符

在 Lua 中,连接两个字符串或者连接字符串和一个其他值使用字符串连接符 ..。在使用过程中应该在字符串连接符前面和后面都添加一个空格,例如:"str" .. 666。特别当其中一个值是 number 时,如果写成 "str"..666666.."str" 这样,运行时就会出错:unexpected symbol near '..'。因为字符串连接符和数字之间没有空格,Lua 就无法区分这是小数点还是字符串连接符了。所以在使用字符串连接符的时候,不要为了方便而省略空格。


本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/lua-quick-start.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容