一、map.tostring方法
map.tostring是Lua语言中的一个常用函数,它用于将一个table类型的变量转化为字符串类型。实现过程中,Lua会先将table中的键值对转换为形如"key=value"的字符串,然后将这些字符串用","连接起来,得到最终的字符串。该函数的语法如下:
table.tostring( table )
其中,table为要转化的table类型变量。
一个典型的例子如下:
local tbl = {name="Jack", age=21, sex="male"}
print( table.tostring(tbl) )
输出结果为: "name=Jack,sex=male,age=21"。注意,输出结果中的键值对的顺序可能并不是原本table中的顺序,这是Lua的一个的特性,程序中应注意处理这种情况。
二、map.tostring打印不出来
在某些情况下,使用map.tostring无法正确打印出table中的内容。通常的情况是,这个table中存在嵌套的table类型变量。
解决这个问题的办法其实很简单:使用一些特殊的符号,如"\n"、"\t"等,来表示换行、制表等格式。这样能够让最终的输出更加清晰易读。
下面是一个范例:
local tbl = {name="Alice", phone={home="123456", work="654321"}, age=24}
function table.tostring( tbl )
local result = "{"
for k, v in pairs(tbl) do
local formatting = k.."="
if type(v) == "table" then
result = result..formatting..table.tostring(v)..","
elseif type(v) == "boolean" then
result = result..formatting..tostring(v)..","
else
result = result..formatting.."\""..v.."\","
end
end
return result.."}"
end
print( table.tostring(tbl) )
输出结果为:
{age=24,name="Alice",phone={home="123456",work="654321"}}
可以看到,使用特殊符号进行格式化之后,输出的结果非常清晰易读。
三、map.tostring转回map
在Lua中,由于map.tostring函数的存在,我们可以将一个table类型的变量在不同函数之间、不同文件之间传递。但是,如果要将这个字符串再次还原回table类型,需要自行编写函数实现。
下面是一个案例:
local tbl = {name="Bob", age=18, sex="male"}
function table.tostring( tbl )
local result = "{"
for k, v in pairs(tbl) do
local formatting = k.."="
if type(v) == "table" then
result = result..formatting..table.tostring(v)..","
elseif type(v) == "boolean" then
result = result..formatting..tostring(v)..","
else
result = result..formatting.."\""..v.."\","
end
end
return result.."}"
end
function string.tomap( str )
str = string.gsub(str, "\n", "")
str = string.gsub(str, "\t", "")
str = string.gsub(str, "%b{}", function (substr)
substr = string.sub(substr, 2, -2)
local map = {}
for _, entry in ipairs(string.split(substr, ",")) do
local pair = string.split(entry, "=")
local k = string.gsub(pair[1], "\"", "")
local v = string.gsub(pair[2], "\"", "")
if string.isnumeric(v) then
v = tonumber(v)
end
map[k] = v
end
return map
end)
return str
end
local str = table.tostring(tbl)
local map = string.tomap(str)
print(map.name, map.age, map.sex)
在上面的例子中,我们实现了一个叫做string.tomap的函数,用于将由table.tostring函数转化成字符串后的结果再次转化为table类型。这里需要用到字符串处理函数,如gsub、ipairs、split等。最终输出的结果为:
Bob 18 male
可以看到,我们成功将由table.tostring函数转换成的字符串再次转化为了table类型。
四、map和string
在开发中,我们经常需要在table类型和字符串类型之间进行转换。上面我们已经介绍了如何通过table.tostring和string.tomap实现这个功能。在这个过程中,我们也可以发现,Lua中字符串的处理函数非常强大,它们能够帮助我们快速地实现很多操作。
比如,Lua中的string.format函数可以帮助我们将变量格式化成字符串输出。下面是一个范例:
local name = "Charlie"
local age = 25
local sex = "male"
local str = string.format("My name is %s, I'm %d years old, %s.", name, age, sex)
print(str)
输出结果为:
My name is Charlie, I'm 25 years old, male.
除此之外,Lua中还有很多其他的字符串处理函数,如string.sub、string.rep等。掌握它们,对于程序开发是非常有帮助的。
五、maptostring后转回map
在一些情况下,我们需要将一个table类型的变量转化成字符串,并将这个字符串保存在文件或数据库中。如果需要从文件或数据库中读取这个字符串,并将其转化回原本的table类型,可以使用上面我们介绍的string.tomap函数。
下面是一个完整的案例:
local tbl = {name="David", age=30, sex="male", phone={home="123456", work="654321"}}
function table.tostring( tbl )
local result = "{"
for k, v in pairs(tbl) do
local formatting = k.."="
if type(v) == "table" then
result = result..formatting..table.tostring(v)..","
elseif type(v) == "boolean" then
result = result..formatting..tostring(v)..","
else
result = result..formatting.."\""..v.."\","
end
end
return result.."}"
end
function string.tomap( str )
str = string.gsub(str, "\n", "")
str = string.gsub(str, "\t", "")
str = string.gsub(str, "%b{}", function (substr)
substr = string.sub(substr, 2, -2)
local map = {}
for _, entry in ipairs(string.split(substr, ",")) do
local pair = string.split(entry, "=")
local k = string.gsub(pair[1], "\"", "")
local v = string.gsub(pair[2], "\"", "")
if string.isnumeric(v) then
v = tonumber(v)
end
map[k] = v
end
return map
end)
return str
end
--将数据转化成字符串
local str = table.tostring(tbl)
--将字符串写入文件
local file = io.open("data.txt", "w")
file:write(str)
file:close()
--从文件中读取字符串
file = io.open("data.txt", "r")
str = file:read("*a")
file:close()
--将字符串转换回table类型
local map = string.tomap(str)
--使用table类型变量
print(map.name, map.age, map.sex, map.phone.home, map.phone.work)
在这个案例中,我们首先使用table.tostring函数将table转化成字符串,然后将这个字符串写入文件中。再使用string.tomap函数读取文件中的字符串,并将其转化回table类型。最后使用table类型变量。