Lua值与类型深入理解
值
在Lua中,只有值有类型,变量不需要定义类型;
local a -- 无需定义类型
print(type(a)) -- nil 变量没有类型
print(type(10)) -- number 只有值有类型
而在C#中,值和变量都有类型。
int b; //变量要指明类型
Console.WriteLine(b.GetType()); // System.Int32
Lua中所有值都是first-class:任何类型(包括function)的值都可赋值给一个变量,也可当作参数传递给另一个function,也可当作返回值被函数返回。
local function f1()
print("f1")
end
local function f2(f)
f()
return function ()
print("f2")
end
end
f2(f1)()
类型
Lua中有8种类型: nil, boolean, number, string, function, userdata, thread, table,其中 function, (full)userdata, table, thread为引用类型
nil 与 boolean
Lua中表示条件false只有两个值:nil和false,其它值均表示条件true(0表示条件true)
local a = 0 -- true
a = "false" -- true
a = false -- false
a = nil -- false
if a then
print("true")
else
print("false")
end
尽管false与nil有时可互相替代,但在table中,给key赋值false只是常规的给它赋值false,而给key赋值nil则表示从table中删除这个key。
local tab = {a = 1, b = 2}
tab.a = nil
tab.b = false
for key, value in pairs(tab) do
print(key, value)
end
-- b false
number
number类型在Lua中有两种内部表现方式,可借助math库获取实际类型。
print(type(1)) -- number
print(math.type(1)) -- integer
print(math.type(1.0)) -- float
标准Lua使用64位整数(范围:-2^63 ~ 2^63-1) 和64位浮点数,也可把Lua编译成32位整数(范围:-2^31 ~ 2^31-1)和32位浮点数;
超出int范围的值会变成科学计数法;
Lua内部会按规则自动将number类型转换int或float类型。
string
string类型是不可变的byte序列,string中可包含任意8位的值(0 ~ 2^8-1)。
string既可以是binary string(与编码无关,如"\0\1"),也可以是text string(如"hello")。
local s1 = "\0\1"
local s2 = "hello"
任何string的长度都是int类型。
table
table类型是一个Dictionary。
- key可以是任何种类(除了nil和NaN),索引的格式为a[key],当key为string时候,可以写成 a.key
local tab = { a = 1, b = 2 }
tab.a = 2
tab["b"] = 3
- value可以是任何种类(除了nil)。当value为nil时,表示删除table中该元素
local tab = { a = 1 }
tab.a = nil
print(#tab) -- 0
- table可表示ordinary arrays, lists, symbol tables, sets, records, graphs, trees
local t1 = { "a", "b", "c"} -- ordinary array/ list
- table类型是一个引用类型
function
Lua里function有两类: Lua function 和 C function
local function func() end -- lua function
int co_func(lua_State* state){
printf("%d\n",10);
lua_yield(state,1);
return 1;
}
int main()
{
lua_State *state = luaL_newstate();
lua_pushcfunction(thread,co_func); //将C function push到Lua stack上
userdata
userdata类型表示一段内存
- userdata分为两类: full userdata 和 light userdata
- full userdata表示的内存由Lua所分配,并且可以由metatable定义额外的操作
- light userdata表示的内存由用户手动分配(malloc)
- userdata由C Lua API创建和修改,无法通过Lua chunk所...
thread
thread实际上是一个coroutine,就算系统只有一个hardware thread,它也支持多个coroutines

浙公网安备 33010602011771号