打印函数,辅助调试
在 Lua 中,最常用的打印语句是 print
函数。这个函数可以接受多个参数,并将它们转换为字符串,然后输出到标准输出(通常是控制台或终端)。print
函数在调试和日志记录中非常有用,因为它可以帮助开发者了解程序的运行状态。
基本的 print
用法
print("Hello, world!") -- 打印字符串
print(123) -- 打印数字
打印多个变量
print
函数可以接受多个参数,并按顺序打印它们,参数之间用制表符(tab)分隔。
local a = 10
local b = 20
print(a, b) -- 打印两个变量
复杂表数据的打印
对于表(table)这样的复杂数据结构,print
仅打印表的内存地址。如果你想打印表的内容,需要编写一个遍历表的函数。
local t = { key1 = "value1", key2 = "value2" }
print(t) -- 这将不会打印表的内容,而是表的地址
-- 遍历并打印表的内容
for k, v in pairs(t) do
print(k, v)
end
-- 遍历并打印表的数组内容
for k, v in ipairs(t) do
print(k, v)
end
自定义的打印table数据函数
-- @function: 打印table的内容,递归
-- @param: tbl 要打印的table
-- @param: level 递归的层数,默认不用传值进来
-- @param: filteDefault 是否过滤打印构造函数,默认为是
-- @return: return
function PrintTable( tbl , level, filteDefault)
local msg = ""
filteDefault = filteDefault or true --默认过滤关键字(DeleteMe, _class_type)
level = level or 1
local indent_str = ""
for i = 1, level do
indent_str = indent_str.." "
end
print(indent_str .. "{")
for k,v in pairs(tbl) do
if filteDefault then
if k ~= "_class_type" and k ~= "DeleteMe" then
local item_str = string.format("%s%s = %s", indent_str .. " ",tostring(k), tostring(v))
print(item_str)
if type(v) == "table" then
PrintTable(v, level + 1)
end
end
else
local item_str = string.format("%s%s = %s", indent_str .. " ",tostring(k), tostring(v))
print(item_str)
if type(v) == "table" then
PrintTable(v, level + 1)
end
end
end
print(indent_str .. "}")
end
for k, v in pairs(package) do
print("package[" .. k .. "] type is " .. type(v));
end
print("---------------------------------------------")
for k, v in pairs(package.loaded) do
print("package.loaded[" .. k .. "] type is " .. type(v));
end
print("---------------------------------------------")
PrintTable(package.loaded['table'])
打印信息
封装一个函数,打印table数据的内容,这里打印package.loaded已加载所有模块及table的内容
package[preload] type is table
package[loadlib] type is function
package[loaded] type is table
package[loaders] type is table
package[cpath] type is string
package[config] type is string
package[path] type is string
package[seeall] type is function---------------------------------------------
package.loaded[string] type is table
package.loaded[debug] type is table
package.loaded[package] type is table
package.loaded[_G] type is table
package.loaded[io] type is table
package.loaded[os] type is table
package.loaded[table] type is table
package.loaded[math] type is table
package.loaded[coroutine] type is table---------------------------------------------
{
setn = function: 00C387F0
insert = function: 00C38B50
getn = function: 00C38A90
foreachi = function: 00C38A70
maxn = function: 00C38AD0
foreach = function: 00C38990
concat = function: 00C38CB0
sort = function: 00C38930
remove = function: 00C38570
}
格式化输出
Lua 还提供了 string.format
函数,用于格式化字符串。这对于需要特定格式输出的情况非常有用。
local name = "Lua"
local version = 5.4
print(string.format("Welcome to %s version %.1f!", name, version))
在这个例子中,%s
用于格式化字符串,%.1f
用于格式化浮点数,保留一位小数。
自定义打印函数
有时,你可能需要根据特定的需求来自定义打印函数,例如,将输出重定向到文件或图形界面。
function customPrint(...)
local args = {...}
for i, v in ipairs(args) do
-- 处理每个参数
end
-- 实现自定义的打印逻辑
end
在这个自定义函中,你可以根据需要处理每个参数,并实现自己的打印逻辑。
在 Lua 中,除了最常用的 print
函数之外,没有内置的其他打印函数。但是,你可以使用其他方法来实现类似打印的功能,或者创建自定义的打印函数。以下是一些常见的替代方法:
io.write
函数:io.write
函数用于向标准输出写入数据,但它不会像print
那样在每次调用后自动添加换行符。
io.write("Hello, ") io.write("world!\n")
string.format
结合print
或io.write:
这里string.format
用于格式化字符串,但它本身不打印。通常与print
或io.write
结合使用以输出格式化后的字符串。print(string.format("Name: %s, Age: %d", "Alice", 30))
- 写入文件: 如果你想将输出重定向到文件,可以使用 Lua 的文件操作函数。
local file = io.open("output.txt", "w") file:write("Hello, file!\n") file:close()
- 自定义打印函数: 你可以根据需要创建自定义的打印函数,例如,用于格式化和打印复杂的数据结构。
function
customPrint(...)
-- 自定义打印逻辑
end
- 使用
tostring
函数:tostring
函数可以将非字符串类型的值转换为字符串,这在打印非字符串类型的数据时很有用。
local num = 123,
print(tostring(num))
- 调试库(
debug
)的使用: Lua 的debug
库提供了一些用于调试的函数,这些函数可以用来打印调试信息,但它们通常用于更复杂的调试场景。
请注意,除了 print
和 io.write
,其他方法都不是直接用于打印的,但可以用于生成可打印的字符串或实现自定义的打印逻辑。在实际应用中,选择哪种方法取决于你的具体需求和场景。
参考:
https://zhuanlan.zhihu.com/p/671145968