前言#
今天我们来一起看一个神奇的函数,这个函数乍一看根本不知道是干嘛用的,仔细一看还是不明白,在查询了多方资料以后终于命名明白他的用途,这里不得不提到一个词——序列化。
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
这个词听起来就高大上,但是我们今天的函数用起来却非常简单,就是调用函数stringdump()
将其它函数序列化,然后函数就可以传递了,还把函数传递到另一个进程,甚至存储到文件中都是可以的。
内容#
string.dump()##
- 原型:string.dump (function)
- 解释:返回一个包含所给函数二进制描述的字符串,以至于在此之后可以使用函数
loadstring()
利用所得到的字符串来返回一个函数拷贝,需要注意的是函数只能是Lua函数并且没有upvalues(外部局部变量)。
Usage##
- 首先新建一个文件将文件命名为dumptest.lua然后辨析额如下代码:
--自定义一个函数
function custom_func(num1, num2)
local ret = num1 + num2;
print("\nnum1 = "..num1)
print("num2 = "..num2)
print("num1 + num2 = "..ret)
end
-- 将函数序列化
local func_content = string.dump(custom_func)
print("\nfunc_content = "..func_content)
-- 将转化后的字符串写入文件
local outfile = io.open("dumptest.txt", "w")
local outnum = outfile:write(func_content)
outfile:close()
-- 从文件总读取内容
local infile = io.open("dumptest.txt", "r")
local incontent = infile:read("*a")
infile:close()
print("\ninput content is "..incontent)
-- 加载函数
local myfunc = loadstring(incontent)
-- 执行函数
myfunc(1, 1)
myfunc(3, 6)
-- 输出这个幸福的七月七
myfunc("7" ,".7")
print("\nthis is a happy day!")
print(os.date())
- 运行结果:
总结#
- 看了这个函数是不是有种非常神奇的感觉,原来传说中的序列化可以离我们这么近。
- 在调用了函数
string.dump()
之后函数custom_func()
被转化成字符串保存在文件中,可以在使用时再取出来。 - 这个函数一般写逻辑代码应该用不到,更多的是做框架的时候用的功能,进过序列化的函数可以通过网络传送、转化、再使用。
- 好了,在这个幸福的日子里,祝你节日快乐吧,别在这搬砖了,抓紧撩妹去吧。