Lua数据类型和变量

2015/11/02 Lua

Lua的数据类型

Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值。值可以存储在变量中,作为参数传递或作为结果返回。 Lua中有8个基本类型,分别为nil、boolean、number、string、userdata、function、thread和table。

Lua基本数据类型

可以使用type函数测试给定变量或者值的类型:

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。例如,打印一个没有赋值的变量,便会输出nil值:

>print(type(a))
nil
>

对于全局变量和table,nil还有“删除”作用,给全局变量或者table表里的变量赋nil值,等同于把它们删掉,执行下面代码:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end

boolean(布尔)

boolean类型只有两个可选值:true(真)和false(假),Lua把false和nil看作“假”,把其他值看作“真”:

print(type(true))
print(type(false))
print(type(nil))

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false!")
end

以上代码的执行结果如下:

$ lua test.lua
boolean
boolean
nil
false 和 nil 都为 false!

number(数字)

Lua默认只有一种number类型:double(双精度)类型。以下几种写法都被看作number类型:

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

以上代码的执行结果如下:

number
number
number
number
number
number

string(字符串)

字符串由一对双引号或单引号来表示,例如:

string1 = "this is string1"
string2 = 'this is string2'

也可以用两个方括号“[[]]”来表示“一块”字符串:

html = [[
<html>
<head></head>
<body>
<a href="http://www.w3cschool.cc/">w3cschool菜鸟教程</a>
</body>
</html>
]]
print(html)

以上代码的执行结果如下:

<html>
<head></head>
<body>
<a href="http://www.w3cschool.cc/">w3cschool菜鸟教程</a>
</body>
</html>

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

使用#计算字符串的长度,放在字符串前面,如下面实例:

len = “www.google.com” print(#len) 14 print(#”www.google.com”) 14

5.table(表)

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

–创建一个空的table local tbl1 = {}

–直接初始化表 local tbl2 = {“apple”, “pear”, “orange”, “grape”} Lua中的表(table)其实是一个“关联数组”,数组的索引可以是数字或者字符串:

– table_test.lua 脚本文件 a = {} a[“key”] = “value” key = 10 a[key] = 22 a[key] = a[key] + 11 for k, v in pairs(a) do print(k .. “ : “ .. v) end 脚本的执行结果如下:

$ lua table_test.lua key : value 10 : 33 不同于其他语言的数组把0作为数组的初始索引,在Lua中,表的默认初始索引一般以1开始:

– table_test2.lua 脚本文件 local tbl = {“apple”, “pear”, “orange”, “grape”} for key, val in pairs(tbl) do print(“Key”, key) end 脚本的执行结果如下:

$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4 table不会固定长度大小,添加新数据时table长度会自动增长,没初始化的table都是nil:

– table_test3.lua 脚本文件 a3 = {} for i = 1, 10 do a3[i] = i end a3[“key”] = “val” print(a3[“key”]) print(a3[“none”]) 脚本的执行结果如下:

$ lua table_test3.lua val nil 6.function(函数)

在Lua中,函数被看作“第一类值”,函数可以存在变量中:

– function_test.lua 脚本文件 function factorial1(n) if n == 0 then return 1 else return n * factorial1(n - 1) end end print(factorial1(5)) factorial2 = factorial1 print(factorial2(5)) 脚本的执行结果如下:

$ lua function_test.lua 120 120 function可以以匿名函数的方式通过参数传递:

– function_test2.lua 脚本文件 function anonymous(tab, fun) for k, v in pairs(tab) do print(fun(k, v)) end end tab = { key1 = “val1”, key2 = “val2” } anonymous(tab, function(key, val) return key .. “ = “ .. val end) 脚本的执行结果如下:

$ lua function_test2.lua key1 = val1 key2 = val2 7.thread(线程)

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

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

8.userdata(自定义类型)

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

Search

    微信好友

    博士的沙漏

    Table of Contents