学习 Lua 对于了解 Javascript 的人来讲就是小菜一碟,Tyler Neylon 写了三篇文章来解释其中的缘由,这是其中的第一篇。javascript
这是经过 Javascript 来学习 Lua 系列文章的第一篇,一共有三篇,第二篇和第三篇。
登录 Tyler 的免费的网络广播频道收听 Lua 能作什么?php
Lua 是一门优雅的,可移植的,高效的而且异常灵活的语言。全部可以编译 C 语言的操做系统都能运行 Lua,这是一些跨平台的框架,好比 Corona SDK 和 Love game engine,选择 Lua 的缘由。Lua 的运行速度很快,足够用来开发游戏——愤怒的小鸟的最初是用 Lua 编写的。 Lua 能和其余的语言很好的融合在一块儿,它做为脚本语言,在 Adobe lightroom 项目中有出色的表现。我认为 Lua 的设计很优美,用起来也很是的舒服。css
对于已经了解 Javascript 的人而言,学习 Lua 是很是简单的,由于Lua 和 Javascript 有不少的共同点。在学习的过程当中,咱们能够经过这些共同点很快的熟悉 Lua,但须要注意二者间一些关键性的不一样的地方。html
经过 Javascript 的相关知识学习 Lua 的系列总共三篇,这是其中的第一篇。这篇文章中包含一些基础概念:安装 Lua,变量,数据类型,操做符和表达式。第二篇将会涉及流程控制和数据结构,第三篇讲解对象相关的一些知识。java
文章中出现的 Javascript 代码大多都遵循 2009 年制定的 EACMScript 5 标准,也就是 ES5 标准。如今最新的 Javascript 标准的是 ES6 或者称为 ES2015。我会用到一些 ES6 的语法,并指出这是 ES6 的特性,这样读者就能知道这段 Javascript 代码遵循的标准。不过读者并不须要了解 ES6,我也不会对用到的 ES6 特性进行解释。node
官方安装指南传送门。
若是在 Mac 上安装了 homebrew,运行 brew install lua
。ubuntu 的话,运行 sudo apt-get install lua5.2
,若是从源码编译安装能够安装最新的版本的 Lua。在 windows 上请使用 LuaDist 安装。linux
在 Max OSX 和 Linux 上经过编译源码的方式安装 Lua 很简单,执行下面的 shell 命令。若是是 Max OS X,把最后一行的 linux 替换为 macosx 。shell
curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz
tar zxf lua-5.3.3.tar.gz
cd lua-5.3.3 make linux test # Mac 的话把 linux 替换为 macosx.
安装完成后,就可使用 lua 命令了,运行 lua 应该看到如下输出。macos
$ lua
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio >
任意一个文本编辑器都能用来写 Lua 脚本,写一段代码保存为 my_file.lua,执行 Lua 脚本相似 node.js 执行 Javascript 脚本,使用命令就行了。ubuntu
lua my_file.lua
Lua 中的多行注释的以 --[[
开始,以 ]]
结尾。 若是 --
以后没有 [[
,那么这行是一个单行注释。例如:
print('Why, hello!') -- print 方法输出一段字符串 --[[ 这里是一个 多行注释!]]
Lua 会忽略缩进。通常的空格也会被忽略,可是会保留字符串的空格和单行注释后面的空白行。行尾的分号可写可不写,通常而言不用写。
和 Javascript 同样, Lua 的变量是动态类型的,也使用垃圾回收器管理内存。多数的 Lua 变量类型都能在 Javascript 中找对应的类型。
Javascript 变量类型 | Lua 变量类型 | Lua 变量例子 |
---|---|---|
boolean | boolean | true or false |
null or undefined | nil | nil |
number | number | 3.141 |
string | string | 'hi' or "there" |
object or array | table | {a=1, [2]=false} |
function | function | function() return 42 end |
symbol(ES6) | unique tables | 'hi' or "there" |
It's handy to classify boolean values in term of falsiness; a value is called falsy when it evaluates to false to a boolean context; Lua 中仅有的假值是 nil 和 false。相似地在 Javascript 中,0
,''
和 undefined
都是假值。
Lua 的 numbers
类型,因为历史缘由,使用了浮点数来表示——就像 Javascript 的 numbers
。从 Lua 5.3 开始,Lua 增长了对整数类型的支持,increasing the range of integral values that can be represented exactly.
直观的来看,若是 Lua 的 number
类型变量被初始化为整数,它被看成一个整数,而且会一直保留整数形式直到遇到可将它变为非整数的操做,好比除法。下面的代码展现了 Lua 如何处计算数学表达式——有些运算获得整数,有些获得浮点数。
-- Lua
n = 100
print(n) --> 100; 使用整数形式存储 print(n * 2) --> 200; 运算结果是整数 print(n / 2) --> 50.0; 运算结果是浮点数
相似 Javascript 中的 objects
,Lua 的 table
类型是一个全能的数据结构。
table
能够被用作哈希表或者是数组。不过 Javascript 中 object
的 keys 只能是字符类型,Lua table
的 keys 能够是任何的非 nil
值。在 Lua 中 只有两个 table 是同一个对象时才会相等,而不是它们拥有相同的内容。
-- Lua
myTable = {}
print(myTable == myTable) --> true print(myTable == {}) --> false
Lua 中 function 是一等公民——能够建立匿名函数,把函数赋值给变量,也能够把函数看成另外一个函数的参数或者返回值。若是在函数中引用了定义在该函数做用域以外的自由变量,将隐式地造成一个闭包(译者注:和 Javascript 中的闭包很相似)。同时 Lua 中的函数支持高效的尾递归,也就是在函数的结尾调用另外一个函数,调用栈不会增长。
Lua 中还有两个类型 userdata 和 thread。userdata 是使用 Lua 的 C 语言 API 调用 C 语言生成的对象。userdata 就像一个拥有私有数据的 table,也能够自定义它的行为。 Lua 的 thread 是一个 coroutine,容许函数使用 yield 一些值并保持自身的栈和内部状态。
Lua 中变量的做用域默认是全局做用域。Lua 的 local
关键字有点像 Javascript 中的 var
,只不过 Lua 中没有声明提高。也就是说,Lua 中的 local
和 ES6 中的 let
同样,都是块级做用域。
-- Lua
phi = 1.618034 -- `phi` 是全局变量。 local gamma = 0.577216 -- `gamma` 只在当前的块做用域下可见。
Lua 中没有常量或者私有变量。不过能够像 Javascript 中同样,使用闭包来模拟私有变量。建立一个函数,在函数中引用定义在函数以外的变量,这就使得这些变量在函数以外不可见,达到相似私有变量的效果。 Lua 的函数相关内容将在下一篇文章中涉及。
Lua 和 Javascript 中的数学运算,像是加法和乘法,基本上是同样的。二者都提供了获取余数的操做%
,不一样的是: Javascript 中的 %
在左侧操做数是负数时会返回负值,而 Lua 中的 %
老是返回非负值。Lua 中可使用 ^ 进行指数操做。
-- Lua
print(2 ^ 10) --> 1024.0 print(-2 % 7) --> 5
Javascript 不支持操做符重载,可是 Lua 支持。Lua 经过一种称为 metamethods(修改元数据) 特殊函数实现的重载,这部份内容将会在最后一篇文章中解释。Javascript 有一个三元操做符,但 Lua 中并无,不过在 Lua 中能实现相似的效果,这须要借助 Lua 中的短路操做符 or 和 and。
-- Lua
-- Lua 中模拟三元操做符.
local x = myBoolean and valueOnTrue or valueOnFalse -- 例子:找到 a 和 b 的中的最大值. local maxNum = (a > b) and a or b -- 相似 Javascript 中的如下代码 -- var maxNum = (a > b) ? a : b;
这个实现颇有效除非 valueOnTrue 是假值。大部分状况下都不会有问题由于 Lua 的数字,字符和表不会被看成假值。
在 Javascript 中被普遍认同的的一个最佳实践是使用 ==
而不是 ==
,由于 Javascript 中的 ==
引起使人疑惑的隐式的类型转换。对于 ===
, Javascript 只有当比较的值有相同的类型的时候才会返回 true
。
Lua 只有 ==
一种比较操做符,和 Javascript 中的 ===
同样要求类型相同。如下的例子使用了 Lua 中的内置函数 tonumber
,它将一个字符串转化为数字。
-- Lua
print(6.0 * 7.0 == '42') --> false, 不一样的类型 print(6.0 * 7.0 == tonumber('42')) --> true, 都是 number 类型
Lua 的 <
和 >
操做符在比较的值是不一样的类型时将会获得 false
。它们比较字符使用字符标排序,比较数字使用数字排序。
Lua 5.3 引入了内置的位操做符,见下表。表中的操做符在 Lua 和 Javascript 中均可用。
操做符 | 含义 |
---|---|
& | 与 |
Ι | 或 |
~ | 取反 |
<< | 左移 |
Lua 中的~
,就像 Javascript 中的 ^。
-- Lua
print(6 & 18) --> 2; 00110b AND 10010b = 00010b. print(6 | 18) --> 22; 00110b OR 10010b = 10110b. print(6 ~ 18) --> 20; 00110b XOR 10010b = 10100b.
Javascript 中区分了 >> 和 >>> 操做符, >> 保持符号而 >>> 使用 0 填充。Lua 中的 >> 就像 Javascript 中的 >>> 的操做符,使用 0 来填充空位。
这篇文章包含了一下基础知识,运行 Lua并理解 Lua 中的数据类型和表达式。下一篇文章将会包含更多的内容,好比Lua 的流程控制关键字,函数和很重要的 table。