• 概述

    • 特性
    • 安装
  • 基本语法
    • 交互式编程
    • 脚本式编程
  • 注释
  • 标识符
  • 全局变量
  • 基本数据类型
    • nil
    • 布尔
    • number
    • 字符串
    • 函数
    • 线程
    • userdata(自定义类型)

摘自Lua教程,仅供学习,无商用

概述

Lua 是一种轻量小巧脚本语言,用标准C语言编写并且源代码开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

特性

  • 轻量级: 编译后仅仅一百余K,可以很方便的嵌入别的程序里
  • 可扩展: Lua**提供了易于使用的扩展接口和机制**:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样
  • 其他特性
    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象
    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持
    • 通过闭包table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等

安装

Linux & Mac上安装 Lua ,只需要下载源码包并在终端解压编译即可

基本语法

交互式编程

Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。

Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用

脚本式编程

保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程(同Java,存储代码 运行程序(lua hello.lua))

在开头添加:#!/usr/local/bin/lua,指定了 Lua 的解释器 /usr/local/bin directory

为脚本添加可执行权限:

./hello.lua

注释

  • 单行注释:

    • -
  • 多行注释:

    –[=[
    多行注释
    多行注释
    –]=]

标识符

  • 定义一个变量,以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)

    • 区分大小写

全局变量

  • 默认情况下,变量总是认为是全局的。

  • 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil

> print(b)
nil
> b=10
> print(b)
10
> 
  • 想删除一个全局变量,只需要将变量赋值为nil

基本数据类型

  • Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table

  • nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
  • boolean 包含两个值:false和true。
  • number 表示双精度类型的实浮点数
  • string 字符串由一对双引号或单引号来表示
  • function 由 C 或 Lua 编写的函数
  • userdata 表示任意存储在变量中的C数据结构
  • thread 表示执行的独立线路,用于执行协同程序
  • table Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表
print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

nil

  • 该类型表示无任何有效值,只有一个值nil,打印未赋值的变量,输出nil

  • 对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

  • nil 作比较时应该加上双引号 “
  • type(type(X))==string—>false
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) doprint(k .. " - " .. v)
endtab1.key1 = nil
for k, v in pairs(tab1) doprint(k .. " - " .. v)
end> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
> 

布尔

Lua 把 false 和 nil 看作是”假”,其他的都为”真”

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

字符串

  • 字符串由一对双引号或单引号来表示
  • 用 2 个方括号 “[[]]” 来表示”一块”字符串
html = [[
<html>
<head></head>
<body><a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
  • 对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字
> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:stdin:1: in main chunk[C]: in ?
> 

以上代码中”error” + 1执行报错了,字符串连接使用的是 ..

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

使用 # 来计算字符串的长度,放在字符串前面,如print(#”www.runoob.com”)

table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表

-- 创建一个空的 table
local tbl1 = {}-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串

-- table_test.lua 脚本文件
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) doprint(k .. " : " .. v)
end$ lua table_test.lua
key : value
10 : 33

Lua 里表的默认初始索引一般以 1 开始

local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) doprint("Key", key)
end$ lua table_test2.lua
Key    1
Key    2
Key    3
Key    4

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

a3 = {}
for i = 1, 10 doa3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])$ lua table_test3.lua
val
nil

函数

函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里

function factorial1(n)if n == 0 thenreturn 1elsereturn n * factorial1(n - 1)end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))$ lua function_test.lua
120
120

function 可以以匿名函数(anonymous function)的方式通过参数传递

-- function_test2.lua 脚本文件
function testFun(tab,fun)for k ,v in pairs(tab) doprint(fun(k,v));end
endtab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数return key.."="..val;
end
);$ lua function_test2.lua
key1 = val1
key2 = val2

线程

Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停

userdata(自定义类型)

用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用

1.0 Lua教程之基本语法相关推荐

  1. Lua 教程 | 菜鸟教程

    Table of Contents Lua 教程 设计目的 Lua 特性 Lua 应用场景 第一个 Lua 程序 Lua 环境安装 Linux 系统上安装 Lua 基本语法 第一个 Lua 程序 交互 ...

  2. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

  3. Swift3.0语言教程字符串与文件的数据转换

    Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...

  4. Swift3.0语言教程字符串转换为数字值

    Swift3.0语言教程字符串转换为数字值 Swift3.0语言教程字符串转换为数字值,在NSString中,开发者可以将字符串转换为数字值,通过这些数字值可以实现一些功能,如加法运算.减法运算等.数 ...

  5. Swift3.0语言教程使用URL字符串

    Swift3.0语言教程使用URL字符串 Swift3.0语言教程使用URL字符串,和路径一样,URL其实也是字符串,我们可以将这些字符串称为URL字符串.本小节将讲解URL字符串的使用. 1.编码 ...

  6. Swift3.0语言教程使用路径字符串

    Swift3.0语言教程使用路径字符串 Swift3.0语言教程使用路径字符串,路径其实是字符串的一种,我们称为路径字符串.本小节将讲解如何使用路径字符串. 1.组合路径 开发者可以将数组快速的组合成 ...

  7. Swift3.0语言教程删除字符与处理字符编码

    Swift3.0语言教程删除字符与处理字符编码 Swift3.0语言教程删除字符 Swift3.0语言教程删除字符与处理字符编码,在字符串中,如果开发者有不需要使用的字符,就可以将这些字符删除.在NS ...

  8. Swift3.0语言教程分割字符串与截取字符串

    Swift3.0语言教程分割字符串与截取字符串 Swift3.0语言教程分割字符串 如果想要快速的创建一个数组,我们可以将字符串进行分割,分割后的内容将会生成一个数组.在NSString中有两个分割字 ...

  9. Swift3.0语言教程组合字符串

    Swift3.0语言教程组合字符串 Swift3.0语言教程组合字符串,当开发者想要将已经存在的字符串进行组合,形成一个新的字符串,可以使用NSString中的两个方法,分别为appending(_: ...

最新文章

  1. 源码安装apache实例
  2. Spark的Local模式及案例
  3. CSS Sprites图片拼合生成器实现思路
  4. 浅谈 Celery 分布式队列
  5. android两个java文件内容_java – 在1个请求中将多个文件从Android上传...
  6. 程序员面试题之从字节截断谈起
  7. javascript的table 对象 属性 方法
  8. spring mvc 上传文件
  9. 代码整洁之道读书笔记----第五章---格式--如何让代码整体布局更清晰
  10. 《集体智慧编程》学习笔记001
  11. gitlab 邮件服务器配置
  12. 实时音频编解码之十一Opus编码
  13. 新西兰梅西大学计算机专业研究生,新西兰梅西大学硕士读几年,新西兰专升硕 | 能进八大,还有机会移民,最快1.5年完成!...
  14. android设置透明主题后背景为黑色,android – 活动应该是透明的,但有黑色背景
  15. 行测判断推理部分之图形推理(位置)
  16. Smartphone--Android真机管理平台
  17. Zookeeper端口和ip修改
  18. 【开发工具】 Office Tool Plus 居然也可以部署 Office 365 我的天 真的是太厉害了
  19. Websocket无法连接
  20. 孤岛危机安装时出现dll错误

热门文章

  1. 常用Unity的优化技巧集锦
  2. 软考考试多少分可以拿到证书?
  3. python中的一些快捷键
  4. proteus中仿真arduino驱动模拟器件(蜂鸣器继电器电机)
  5. 计算机交互工作原理,键盘,鼠标与计算机之间的交互原理
  6. 阅读Android源码的一些姿势
  7. Visual Studio Code(vs code)函数跳转及返回
  8. Linux文件系统功能和作用详解
  9. 硬件笔记(3)---- SOP8 SPI FLASH短接下载程序的原理
  10. java打印设置缩放_Java PrintSetup.setPaperSize方法代码示例