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

posted @ 2021-06-16 17:28  withpear  阅读(1084)  评论(0)    收藏  举报