[转帖]lua入门

lua,入门 · 浏览次数 : 0

小编点评

**Lua 设计简介** Lua 是一个过程型动态语言,提供灵活的扩展和定制功能。它具有如下的特性: * **无类型变量:**变量名没有类型,值才有类型。 * **表(table):**混合了数组、哈希,可以用任何类型的值作为 key 和 value。 * **一致且富有表达力的表构造语法:**方便描述复杂的数据。 * **函数:**支持匿名函数和正则尾递归。 * **词法定界(lexical scoping)和闭包(closure):**支持词法定界和闭包。 * **thread 类型和结构化的协程(coroutine)机制:**方便实现协作式多任务。 * **字符串文本编译:**运行期能编译字符串形式的程序文本并载入虚拟机执行。 * **动态元机制(dynamic metamechanism):**允许程序运行时根据需要改变或扩充语法设施的内定语义。 * **原型(prototype-based)的面向对象模型:**方便地利用表和动态元机制实现基于原型的面向对象模型。 **安装 Lua** * 系统上安装:下载源码包并在终端解压编译即可。 * 使用 homebrew:`brew install lua`。 * 下载 Lua 镜像:`curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make linux testmake installMac OS X`。 **运行 Lua** * 双击安装后的 “SciTE” IDE 运行 Lua 程序。 * 使用 `lua HelloWorld.lua` 运行示例文件。

正文

入门

[TOC]

@date: 2018-3-18


简介

Lua的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

作为一门过程型动态语言,Lua有着如下的特性:

  • 变量名没有类型,值才有类型,变量名在运行时可与任何类型的值绑定;
  • 语言只提供唯一一种数据结构,称为表(table),它混合了数组、哈希,可以用任何类型的值作为 key 和 value。提供了一致且富有表达力的表构造语法,使得 Lua 很适合描述复杂的数据;
  • 函数是一等类型,支持匿名函数和正则尾递归(proper tail recursion);
  • 支持词法定界(lexical scoping)和闭包(closure);
  • 提供 thread 类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;
  • 运行期能编译字符串形式的程序文本并载入虚拟机执行;
  • 通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic metamechanism),从而允许程序运行时根据需要改变或扩充语法设施的内定语义;
  • 能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;
  • 从 5.1 版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序;

Lua应用场景:

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

安装

Lua最新版本是Lua 5.3.4(截止到2018-3-18)。

官网:http://www.lua.org/

Linux 系统上安装

Linux & Mac上安装 Lua 安装非常简单,只需要下载源码包并在终端解压编译即可,本文使用了5.3.0版本进行安装:

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

Mac OS X 系统上安装

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install

Mac 上也可以通过 homebrew 安装:

brew install lua

Window 系统上安装 Lua

window下你可以使用一个叫”SciTE”的IDE环境来执行lua程序,下载地址为: Github 下载地址:https://github.com/rjpcomputing/luaforwindows/releases Google Code下载地址 : https://code.google.com/p/luaforwindows/downloads/list 双击安装后即可在该环境下编写 Lua 程序并运行。

你也可以使用 Lua 官方推荐的方法使用 LuaDist:http://luadist.org/

安装好后查看版本:

$ lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

Lua 和 LuaJIT 的区别

Lua 非常高效,它运行得比许多其它脚本(如 Perl、Python、Ruby)都快,这点在第三方的独立测评中得到了证实。尽管如此,仍然会有人不满足,他们总觉得还不够快。LuaJIT 就是一个为了再榨出一些速度的尝试,它利用即时编译(Just-in Time)技术把 Lua 代码编译成本地机器码后交由 CPU 直接执行。

LuaJIT 2 的测评报告表明,在数值运算、循环与函数调用、协程切换、字符串操作等许多方面它的加速效果都很显著。

凭借着 FFI 特性,LuaJIT 2 在那些需要频繁地调用外部 C/C++ 代码的场景,也要比标准 Lua 解释器快很多。

目前 LuaJIT 2 已经支持包括 i386、x86_64、ARM、PowerPC 以及 MIPS 等多种不同的体系结构。

LuaJIT 是采用 C 和汇编语言编写的 Lua 解释器与即时编译器。LuaJIT 被设计成全兼容标准的 Lua 5.1 语言,同时可选地支持 Lua 5.2 和 Lua 5.3 中的一些不破坏向后兼容性的有用特性。因此,标准 Lua 语言的代码可以不加修改地运行在 LuaJIT 之上。

LuaJIT 和标准 Lua 解释器的一大区别是,LuaJIT 的执行速度,即使是其汇编编写的 Lua 解释器,也要比标准 Lua 5.1 解释器快很多,可以说是一个高效的 Lua 实现。另一个区别是,LuaJIT 支持比标准 Lua 5.1 语言更多的基本原语和特性,因此功能上也要更加强大。

LuaJIT 官网链接:http://luajit.org

OpenResty 与 Lua、LuaJIT

自从 OpenResty 1.5.8.1 版本之后,默认捆绑的 Lua 解释器就被替换成了 LuaJIT,而不再是标准 Lua。也就是,我们安装了OpenResty也会包含Lua解释器。

OpenResty 官网链接:http://openresty.org/cn/

基础语法

Hello World

我们创建一个 HelloWorld.lua 文件,代码如下:

print("Hello World!")

执行以下命令:

$ lua HelloWorld.lua

输出结果为: Hello World!

Lua也提供了交互式编程。打开命令行输入lua就会进入交互式编程模式:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print("Hello World!")
Hello World!
>

注释

两个减号是单行注释:

--

多行注释:

--[[
 多行注释
 多行注释
 --]]

标示符

Lua标示符以一个字母 A 到 Z 或 a 到 z 或下划线_开头后加上0个或多个字母,下划线,数字(0到9)。
最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
Lua 不允许使用特殊字符如 @$, 和 % 来定义标示符。 Lua区分大小写。

关键词

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:

and	break	do	else
elseif	end	false	for
function	if	in	local
nil	not	or	repeat
return	then	true	until
while		

一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION )被保留用于 Lua 内部全局变量。

变量定义

变量在使用前,必须在代码中进行声明,即创建该变量。

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值:

name = "yjc"
year = 2018
a = true
score = 98.01

变量的默认值均为 nil。访问一个没有初始化的全局变量不会出错,只不过返回结果是:nil。当然如果你想删除一个全局变量,只需要将变量赋值为nil即可:

score = 98.01
score = nil

Lua 变量作用域:

a = 10	--全局变量
local b = 10 	--局部变量

Lua 中的局部变量要用local关键字来显式定义,不使用 local 显式定义的变量就是全局变量。就算在if等语句块中,只要没使用local关键字来显式定义,也是全局变量,这一点和别的语言不同。

实际编程中尽量使用局部变量。

拓展阅读

1、http://notebook.kulchenko.com/programming/lua-good-different-bad-and-ugly-parts

与[转帖]lua入门相似的内容:

[转帖]lua入门

入门 [TOC] @date: 2018-3-18 简介 Lua的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 作为一门过程型动态语言,Lua有着如下的特性: 变量名没有类型,值才有类型,变量名在运行时可与任何类型的值绑定; 语言只提供唯一一种数据结构,称为表(table)

[转帖]lua-book

http://me.52fhy.com/lua-book/chapter2.html 数据类型 [TOC] @date: 2018-3-18 Lua中有8个基本类型分别为:nil、boolean、number、string、table、function、userdata、thread。 函数 typ

[转帖]lua-book-运算符

http://me.52fhy.com/lua-book/chapter3.html Lua支持下列主要的运算符: 算术运算符 关系运算符 逻辑运算符 赋值运算符 还支持..、#特殊运算符。其中赋值运算符仅支持=,不支持C语言的+=、++等运算符。 算术运算符 + 加法 - 减法或者负号 * 乘法

[转帖]lua-book-控制语句

http://me.52fhy.com/lua-book/chapter4.html Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。 Lua 提供的控制语句部分特征类似

[转帖]lua-book-函数

http://me.52fhy.com/lua-book/chapter5.html 在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。 函数定义 函数定义格式: function function_name (arc) -- ar

[转帖]lua-book-模块

http://me.52fhy.com/lua-book/chapter6.html 模块 从Lua5.1开始,Lua添加了对模块和包的支持。 Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个table,然后把需要导出的常量、函数放入其中,最后返回这个

[转帖]lua-book-常用库介绍

http://me.52fhy.com/lua-book/chapter7.html String 库 .. 链接两个字符串 string.upper(argument) 字符串全部转为大写字母。 string.lower(argument) 字符串全部转为小写字母。 string.len(arg)

[转帖]lua-book-文件操作

http://me.52fhy.com/lua-book/chapter8.html Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。 简单模式(simple model) 拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。 完全模式(complete model

[转帖]lua-book-元表

http://me.52fhy.com/lua-book/chapter9.html 在Lua5.1语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,类似PHP的魔术方法。Python里也有元类(metaclass)一说。 通过元表,Lua有了更多的扩展特性。Lua

【转帖】Lua,LuaJIT,Luarocks的安装与配置-史上最详细【Linux】

目录 一,lunux下lua安装 二,安装luarocks lua包管理工具 三,LuaJIT的安装 既然各位都点开看了,那么Lua语言不用我介绍了吧,LuaJIT是lua的一个Just-In-Time也就是运行时编译器,就是存储热点代码直接转化为二进制,JIT是一个概念,Java 底层也有JIT编