目录
  1. 1. 类型与值
    1. 1.1. Lua8种基本类型
      1. 1.1.1. nil(空)
      2. 1.1.2. boolean(布尔)
      3. 1.1.3. number(数字)
      4. 1.1.4. string(字符串)
      5. 1.1.5. table(表)
      6. 1.1.6. function(函数)
      7. 1.1.7. userdata(自定义类型)和thread(线程)
chapter2-类型与值

类型与值

Lua8种基本类型

nil类型(空)、boolean(布尔类型)、number(数字类型)、string(字符串)、userdata(自定义)、function(函数)、thread(线程)和table(表)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print(type("Hello World !"))  -- string类型
print(type(10*3)) -- number类型
print(type(print)) -- function类型
print(type(type)) -- function类型
print(type(true)) -- boolean类型
print(type(nil)) -- nil类型
print(type(type(X))) -- string类型(type最终返回的是一个字符串)

-- 设变量a
print(type(a)) -- 打印出的是nil类型
a = 10
print(type(a)) -- 打印的是number类型
a = "string"
print(type(a)) -- 打印的是string类型
a = print -- 这里可以将a看做函数print的别名
a(type(a)) -- 这里使用a表示使用print

nil(空)

nil 是一种类型,只有一个 nil 值 ,它的主要能工是用来区别其他任何值。用于表示无效值。

boolean(布尔)

Lua将false和nil值视为假,将除此之外的值视为真。

number(数字)

number类型表示实数。lua中所有的数字可以表示任何一个32位的整数,而不会产生四舍五入的错误。并且现在有的cpu浮点数运算可能更快。
也可以通过重新编译lua,也可以用其他类型表示数字。具体做法详见发行版中的luaconf.h

string(字符串)

lua中的字符串通常表示一个字符序列。其采用8位编码,lua字符串中的字符可以具有任何数字值编码,包括数值0,它可以讲任意二进制数据存储到一个字符串中。
lua的字符串是不可变值,修改字符需要创建一个新的字符串。

  1. 一对匹配引号(""或’’)界定字符串
  2. 一对匹配双方括号界定字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 function my_string()
print("用双引号界定打印字符串")
print("one line\n\"in quotes \",'in quotes'") -- 用普通的双引号界定打印字符串
print("用单引号界定打印字符串")
print('a backslash inside quotes : \'\\\'') -- 用单引号界定打印字符串
print("用ascii码打印字符串")
print("正常字符")
print("alo\n123\"")
print("ascii码字符")
print('\97lo\10\04923"') -- a --> \97 \n --> \10 1 --> \049

print("用双方括号界定打印字符串")
-- 可以简化那些已经包含了注释块的代码
page = [==[
--[[
a=b[c[i]]
--]]
]==]

page1 = [[
<html>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
</html>
]]
print(page)
print(page1)
end
--[==[
--aa
--]==]
my_string()
  1. 数字与字符串的自动转换
1
2
3
4
5
6
print("10" + 1) -- 最终转换为string
print("10 + 1") -- 本来就是字符串
print("-5.3e-10"*"2") -- 两个字符串进行相乘,如果是number,自动进行计算
-- print("hello" + 1) -- 这一行是错误代码,字母不能和数字相计算
print(10 .. 20) -- ".."作为连字符,将两个数字作为字符串连接起来,中间必须有空格
print("10" .. "20") -- 如果".."两边是字符,则不管有没有空格,都能将其连接起来
  1. 使用tonumber将字符串转换为数字
1
2
3
4
5
6
7
8
9
10
11
12
13
  line = io.read() -- 从标准输入读取字符到line全局变量中
n = tonumber(line) -- 将line变量中字符串转换为数字(如果字符串是字母,则返回nil,如果是实数,则返回number类型)

if n == nil then
error(line .. "is not a vaild number")
else
print(n*2)
end

s = tostring(n) -- 将一个数字转换为字符串

print(s == "10")
print(10 .. "" == "10") -- 这样将10连接为一个字符串
  1. 获取字符串的长度
1
2
3
a = "hello world"
print(#a) -- 在变量名前面加"#"就能获取变量的长度,一般都是字符串
print(#"good\0bye") -- 也可以直接在字符串的前面加"#"也能获取字符串长度

table(表)

table类型实现了关联数组,它具有一种特殊的索引方式,可以使用字符串、整数等来索引(除了nil)。
table是一个对象,是一种动态分配的对象。
lua中通过table表示普通数组、符号表、集合、记录、队列和其他数据结构。
lua通过table表示模块、包和对象。比如io.read(),表示使用字符串read作为key来索引table类型的io。

  1. table的创建是由动态表达式完成的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a = {}   -- 创建一个table,并将它的引用存储到a中
k = "color" -- k是一个变量
a[k] = "green" -- 这里k作为a的key , key = k = "color"
print(a[k]) -- 这里打印的是key为"k"的value
a[9] = "great" -- a中key=9的value=great
print(a[9]) -- 这里打印出key=9的value
a["num"] = 10 -- key="num"的value=10
print(a["num"])

k = 9 -- 这里变量k的值更改

print(a[k]) -- 打印的是key=k=9的value=great

a["num"] = a["num"]+1
print(a["num"])
  1. table永远是匿名的,table变量和自身没有固定联系
1
2
3
4
5
6
7
8
a = {}
a["x"] = 10 -- table a 的key="x"的value=10
b = a -- 创建table b , table a 将自己赋值给table b
print(b["x"]) -- 现在从table b 能获取table a的所有变量
b["x"] = 20 -- table b 的key有更改,table a也会一起更改
print(a["x"])
a = nil -- table a 被回收 , 现在只有table b 被引用
b = nil -- table b 被回收, 再也没有对table的引用
  1. table会自增长
1
2
3
4
5
6
7
8
9
10
11
a = {}

-- 这使得table a的key从1自动增长到1000
for i=1,1000 do
a[i] = i*2
end

print(a[9])
a["x"] = 10 -- 在table a中创建一个新的key
print(a["x"]) -- 这个key在table a中存在
print(a["y"]) -- 这个key不存在
  1. a.x和a[x]的区别
    a.x等同于a[“x”],a.x中的x是table中的key(通常这个key是固定不变的),a[x]中的x是变量,它可以指定一个key。
  2. table的索引
    table中的索引以1作为索引起始值。长度操作符"#“返回的是最后一个索引值。
    长度操作符”#"用来处理没有空隙的数组。table.maxn用来处理有空隙的数组。
1
2
3
4
5
6
7
8
9
a = {}
a[1000] = 1 -- 这个数组是有空隙的数组,只有索引1000有值,其他的都没有值。不能用"#"
print(table.maxn(a)) -- table.maxn()返回这个table最大正索引数 lua5.1中使用

b = {}
for i=1,10 do -- 这个table 10个索引都有值,这个就是没有空隙的数组
b[i]=i*2
end
print(#b) -- 返回这个数组长度
  1. key值问题
    table中任何类型都可以用来索引,如果是数字0和字符"0"作索引,它们不是一个索引,会被分为两个。遇到这样的,我们可以用显示转换。
1
2
3
4
5
6
7
8
9
10
11
i = 10 ; j = "10" ; k = "+10"

a = {}
a[i] = "one value"
a[j] = "another value"
a[k] = "yet another value"

print(a[i])
print(a[j])
print(a[tonumber(j)]) --将字符串"10"转换为数字10
print(a[tonumber(k)]) -- 将"+10"转换为数字10

function(函数)

函数可以存储到变量中,可以通过参数传递给其他函数,可以作为其他函数的返回值。
lua可以调用自身lua语言写的函数,也可以调用 c语言写的函数。

userdata(自定义类型)和thread(线程)

userdata类型可以将任意c语言数据存储到lua变量中。标准的I/O库就用userdata表示文件。

文章作者: rack-leen
文章链接: http://yoursite.com/2019/08/17/Lua/Lua%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AC%94%E8%AE%B0/part-1/chapter2-%E7%B1%BB%E5%9E%8B%E4%B8%8E%E5%80%BC/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论