学习 Lua 的第一天

 

我想起了我最开始学习 asp 的时候,看到的 10 天精通 ASP 的一系列文章,我还特意都保存了下来,回去慢看看。

现在我貌似要进行 10 天精通 lua 了。

简介

Lua 有 5.1,5.2,5.3 三个主要版本,各版本之间有一些语法上的差异,不完全兼容,由于 OpenResty 使用的是 Lua 5.1 + LuaJIT 。 因此我选择从学习 Lua 5.1 开始。

注释

单行注释使用简单的双横线 -- 例如:

-- this is a comment
-- 这是中文注释
print("hello lua") -- 行尾注释。

多行祝生意使用 --[[ 开头 ]] 结尾:

--[[
  多行注释,写啥都行。除了两个连续的方括号。
]]

多行注释可以在开始和结尾的方括号中间加入若干个等号 =

--[==[
  [[这样就可以在注释里面写连续的两个方括号了]]
  Yes
]==]

数据类型

Lua 语言提供了六种基本的数据类型:

  • nil : 表示不存在的空对象或无效值,类似 Python 的 None;
  • boolean : 布尔类型,取值为 true 或者 false
  • number : 数字类型,不区分整数和浮点数 (5.3 开始引入了证书,并支持位运算)
  • function : 函数类型
  • table : 表类型。

使用函数 type() 可以测试变量的类型,它以字符串的形式返回类型的名称:

print(type(nil)) -- nil
print(type(true)) -- boolean
print(type(42)) -- number
print(type(2.782)) -- number
print(type("hellowrold")) -- string
print(type(print)) -- function
print(type(table)) -- table (table 是 Lua 标准库里的一个表)

Lua 是动态语言,所以生命变量不需要显式地写出类型,变量也可以存储任意类型的值:

x = 2020 -- number
x = "lua" -- string
x = nil -- nil


string

Lua 可以搞笑地处理字符串,几 kb 或者 mb 的长字符串也不会对效率造成影响,可以放心地使用字符串存储大块的数据。

定义:

单引号或者双引号,支持转转义字符,还可以使用两个方括号的形式支持 raw string:

print('openresty')
print("It's work")
print("lua\tnginx")
print([[raw string \r\n]]) -- 这里的 \r\n 不会被转义
print([[^\d+.\d+$]])
print([["", '', ""]]) -- 引号无需转义

x = [=[ -- 这里的换行符不会包含在字符串里面
 [[no \r\n , just one line]] 
]=]

特点:

Lua 里的字符串更准确地说应该是“字符序列”,不仅可以包含可见字符,还能够包含任意的二进制数据。

Lua 字符串的另一个提点是只读的,类似 Java。

Lua 在内部使用一个全局散列表来管理所有的字符串,所以多个相同的字符串不会占用多份内存,而且字符串的相等比较成本很低,不需要逐个检查里面的字符,而是直接比较两者的散列值。

变量

lua 里面的变量有作用域的感念,分为局部变量和全局变量,名字区分大小写。

局部变量需要使用 local 关键字声明,作用域仅限本代码块(文件内或者语句块内)。

没有使用 local 色号干嘛的变量是全局变量不需要 生命就可以直接使用。

变量没有显式赋值,那么他的值就是 nil

x = 1
local str = "matrix"

do 
  local pi = 3.14
end

print(type(pi)) -- 局部变量消失,访问的是全局变量 pi

一个比较常用的全局变量是 _ (下划线),通常用作占位符。暂存某些值并忽略。

Lua 中没有常量,实践中我们通常用全大写名字的变量来表示常量:

local MAX_COUNT = 1000 -- 全大侠变量,提醒开发者应当当作常量来使用。

运算符

数学运算

支持基本的四则运算符

  • 取模 : %
  • 幂运算: ^ :

除法会返回小数

不支持 ++-- 操作

关系运算

支持关系运算符

注意; 不等使用的是: ~=

比较大小时,类型不同会报错。

比较等于或者不等于时,类型不同会返回 false。

常见的情况时比较字符串和数字,为了避免发生意外,必须使用函数 tonumber()tostring() 显式转换成数字或者字符串后在做比较。

逻辑运算

Lua 的逻辑运算符有: and or not 三个。规则有些特殊:

  • nilfalse 是假,其他都是真,包括数字 0.
  • x and y , 如果 x 是真,返回 y, 否则返回 x;
  • x or y , 与 and 操作相反,如果 x 是真,返回 x, 否则返回 y;
  • not x , 只返回 true / false , 对 x 取反。

利用 Lua 逻辑运算符的特性可以实现非常灵活的赋值功能:

-- 为 x 赋初始值, count 不存在则默认值是 100
local x = count or 100

-- 相当于 a ? b : c
local y = a and b or c

字符串

连接字符串使用 .. , 可以自动把数字转成字符串:

pirnt("hello" .. " " .. "world")

print("room number is " .. 404)


计算字符串长度使用 `#` :

```lua
print(#'openresty') -- 计算字符产长度, 输出 9


其他

在匀速教案是我们需要注意的是操作数是 nil 的情况,很多对 nil 的运损都会导致错误:

x = nil
print(1 + x)                   
print("msg is " .. x)

如果一个变量可能是 nil, 做好使用 or 运算符给他一个默认值:

print(1 + (x or 2))

print("msg is " .. ( x or '-'))

Power by TeXt.