开源软件名称(OpenSource Name):kikito/inspect.lua开源软件地址(OpenSource Url):https://github.com/kikito/inspect.lua开源编程语言(OpenSource Language):Lua 99.0%开源软件介绍(OpenSource Introduction):inspect.luaThis library transforms any Lua value into a human-readable representation. It is especially useful for debugging errors in tables. The objective here is human understanding (i.e. for debugging), not serialization or compactness. Examples of use
assert(inspect(1) == "1")
assert(inspect("Hello") == '"Hello"') Tables, on the other hand, are rendered in a way a human can read easily. "Array-like" tables are rendered horizontally: assert(inspect({1,2,3,4}) == "{ 1, 2, 3, 4 }") "Dictionary-like" tables are rendered with one element per line: assert(inspect({a=1,b=2}) == [[{
a = 1,
b = 2
}]]) The keys will be sorted alphanumerically when possible. "Hybrid" tables will have the array part on the first line, and the dictionary part just below them: assert(inspect({1,2,3,b=2,a=1}) == [[{ 1, 2, 3,
a = 1,
b = 2
}]]) Subtables are indented with two spaces per level. assert(inspect({a={b=2}}) == [[{
a = {
b = 2
}
}]]) Functions, userdata and any other custom types from Luajit are simply as assert(inspect({ f = print, ud = some_user_data, thread = a_thread} ) == [[{
f = <function 1>,
u = <userdata 1>,
thread = <thread 1>
}]]) If the table has a metatable, inspect will include it at the end, in a special field called assert(inspect(setmetatable({a=1}, {b=2}) == [[{
a = 1
<metatable> = {
b = 2
}
}]]))
local a = {1, 2}
local b = {3, 4, a}
a[3] = b -- a references b, and b references a
assert(inspect(a) == "<1>{ 1, 2, { 3, 4, <table 1> } }") Notice that since both options
options.depth
local t5 = {a = {b = {c = {d = {e = 5}}}}}
assert(inspect(t5, {depth = 4}) == [[{
a = {
b = {
c = {
d = {...}
}
}
}
}]])
assert(inspect(t5, {depth = 2}) == [[{
a = {
b = {...}
}
}]])
options.newline & options.indentThese are the strings used by By default, local t = {a={b=1}}
assert(inspect(t) == [[{
a = {
b = 1
}
}]])
assert(inspect(t, {newline='@', indent="++"}), "{@++a = {@++++b = 1@++}@}" options.process
local processed_item = function(item, path)
ExamplesRemove a particular metatable from the result: local t = {1,2,3}
local mt = {b = 2}
setmetatable(t, mt)
local remove_mt = function(item)
if item ~= mt then return item end
end
-- mt does not appear
assert(inspect(t, {process = remove_mt}) == "{ 1, 2, 3 }") The previous exaple only works for a particular metatable. If you want to make all metatables, you can use the local t, mt = ... -- (defined as before)
local remove_all_metatables = function(item, path)
if path[#path] ~= inspect.METATABLE then return item end
end
assert(inspect(t, {process = remove_all_metatables}) == "{ 1, 2, 3 }") Filter a value: local anonymize_password = function(item, path)
if path[#path] == 'password' then return "XXXX" end
return item
end
local info = {user = 'peter', password = 'secret'}
assert(inspect(info, {process = anonymize_password}) == [[{
password = "XXXX",
user = "peter"
}]]) Gotchas / WarningsThis method is not appropriate for saving/restoring tables. It is meant to be used by the programmer mainly while debugging a program. InstallationIf you are using luarocks, just run
Otherwise, you can just copy the inspect.lua file somewhere in your projects (maybe inside a /lib/ folder) and require it accordingly. Remember to store the value returned by require somewhere! (I suggest a local variable named inspect, although others might like table.inspect)
Also, make sure to read the license; the text of that license file must appear somewhere in your projects' files. For your convenience, it's included at the begining of inspect.lua. ContributingThis project uses Teal, a typed dialect of Lua (which generates plain lua files too) If you want to send a pull request to this project, first of all, thank you! You will need to install the. You can install all of them by running:
When writing your PR, please make your modifications on the
This will generate If you are sending a pull request, you might want to add some specs in the Change logRead it on the CHANGELOG.md file |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论