
字符串.jpg
前言
前面一篇文章我們介紹了把參數(shù)轉(zhuǎn)換成數(shù)字的函數(shù),今天來(lái)看一個(gè)把參數(shù)轉(zhuǎn)換成字符串的函數(shù),話說(shuō)這個(gè)函數(shù)我在寫lua的時(shí)候幾乎每天都用到,這個(gè)函數(shù)適應(yīng)性簡(jiǎn)直太強(qiáng)了,無(wú)論你傳給它什么參數(shù),它都能轉(zhuǎn)換成字符串,而今天我看了一下文檔,發(fā)現(xiàn)這個(gè)函數(shù)居然還有進(jìn)階的用法,我們一起來(lái)看一下吧!
內(nèi)容
tostring
- tostring (e)
- 解釋:這個(gè)函數(shù)能接收任何類型的參數(shù),并且將參數(shù)轉(zhuǎn)換成一個(gè)合理格式的字符串,如果想要完全的控制轉(zhuǎn)換的邏輯,可以嘗試使用
string.format函數(shù)。另外,如果被傳入的參數(shù)是一個(gè)包含元表的table,并且這個(gè)元表還正確的包含__tostring字段,那么當(dāng)這個(gè)table被作為參數(shù)傳入函數(shù)的時(shí)候就會(huì)調(diào)用__tostring對(duì)應(yīng)的函數(shù),同時(shí)使用e作為函數(shù)參數(shù),并且將函數(shù)的返回值作為'tostring'的返回值。
usage
- 首先我們新建一個(gè)文件將文件命名為tostringtest.lua然后編寫代碼如下:
-- 定義一個(gè)等待轉(zhuǎn)換的列表
local wait_list = {
a = 13,
b = "36",
c = "52s",
d = false,
e = function() print("e") end,
}
-- 轉(zhuǎn)換已經(jīng)是數(shù)字的變量
print("\nwait_list.a =", tostring(wait_list.a))
-- 轉(zhuǎn)換全是數(shù)字的字符串
print("\nwait_list.b =", tostring(wait_list.b))
-- 轉(zhuǎn)換包含字母的字符串
print("\nwait_list.c =", tostring(wait_list.c))
-- 轉(zhuǎn)換值為false的變量
print("\nwait_list.d =", tostring(wait_list.d))
-- 轉(zhuǎn)換保存著函數(shù)的變量
print("\nwait_list.e =", tostring(wait_list.e))
-- 轉(zhuǎn)換一個(gè)為nil的變量
print("\nwait_list.f =", tostring(wait_list.f))
-- 轉(zhuǎn)換一個(gè)不存在元表的table
print("\nwait_list =", tostring(wait_list))
-- 設(shè)置一個(gè)不包含__tostring字段的元表
setmetatable(wait_list, {__index = {g = "index"}})
print("\nwait_list =", tostring(wait_list))
-- 查看元表是否生效
print("\nwait_list.g =", tostring(wait_list.g))
-- 設(shè)置一個(gè)包含__tostring字段的元表
setmetatable(wait_list, {__tostring = function (param)
return "this is a table named wait_list!"
end})
print("\nwait_list =", tostring(wait_list))
- 運(yùn)行結(jié)果

base_tostring.png
總結(jié)
- 通過(guò)轉(zhuǎn)換變量
a、b、c、d、e、f的值可知,這個(gè)函數(shù)簡(jiǎn)直就是一個(gè)大胃王,不管什么類型的參數(shù)都能轉(zhuǎn)換成相應(yīng)的字符串。 - 通過(guò)給表wait_list設(shè)置包含
__tostring字段的元表,可以通過(guò)自定義函數(shù)來(lái)決定返回的字符串內(nèi)容。 - 我嘗試了給元表的
__tostring字段設(shè)置一個(gè)table,但是會(huì)報(bào)錯(cuò),貌似這里只能是一個(gè)函數(shù)。 - 注意在
__tostring字段的函數(shù)中,不能在使用tostring(param),這樣會(huì)死循環(huán)造成堆棧溢出,但是參數(shù)如果改變成其他的是沒(méi)問(wèn)題的。