중첩 된 테이블 (n-deep)이 포함 된 테이블의 내용을 표시하는 데 문제가 있습니다. print
성명이나 빠르고 더러운 것을 통해 std 또는 콘솔에 덤프하고 싶지만 방법을 알 수 없습니다. NSDictionary
gdb를 사용하여 인쇄 할 때 얻을 수있는 대략적인 것을 찾고 있습니다.
답변
테이블 직렬화에 대한 Lua Wiki를 자유롭게 찾아보십시오 . 콘솔에 테이블을 덤프하는 방법에 대한 여러 가지 방법을 나열합니다.
자신에게 가장 적합한 것을 선택하기 만하면됩니다. 이를 수행하는 방법에는 여러 가지가 있지만 일반적으로 Penlight의 방법을 사용합니다 .
> t = { a = { b = { c = "Hello world!", 1 }, 2, d = { 3 } } }
> require 'pl.pretty'.dump(t)
{
a = {
d = {
3
},
b = {
c = "Hello world!",
1
},
2
}
}
답변
이 질문이 이미 답변 된 것으로 표시된 것을 알고 있지만 여기에 내 라이브러리를 연결하겠습니다. inspect.lua라고하며 여기에서 찾을 수 있습니다.
https://github.com/kikito/inspect.lua
다른 파일에서 요구할 수있는 단일 파일입니다. Lua 값을 사람이 읽을 수있는 문자열로 변환하는 함수를 반환합니다.
local inspect = require('inspect')
print(inspect({1,2,3})) -- {1, 2, 3}
print(inspect({a=1,b=2})
-- {
-- a = 1
-- b = 2
-- }
하위 테이블을 적절하게 들여 쓰기하고 “재귀 테이블”(자신에 대한 참조를 포함하는 테이블)을 올바르게 처리하므로 무한 루프에 들어 가지 않습니다. 합리적인 방식으로 값을 정렬합니다. 또한 메타 테이블 정보를 인쇄합니다.
문안 인사!
답변
나는 이것이 유용하다는 것을 알았다. 재귀라면 중첩 된 테이블도 인쇄 할 수 있기 때문입니다. 출력에서 가장 예쁜 형식을 제공하지는 않지만 이러한 간단한 기능의 경우 디버깅을 이기기가 어렵습니다.
function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
예 :
local people = {
{
name = "Fred",
address = "16 Long Street",
phone = "123456"
},
{
name = "Wilma",
address = "16 Long Street",
phone = "123456"
},
{
name = "Barney",
address = "17 Long Street",
phone = "123457"
}
}
print("People:", dump(people))
다음 출력을 생성합니다.
사람 : {[1] = {[ “address”] = 16 Long Street, [ “phone”] = 123456, [ “name”] = Fred,}, [2] = {[ “address”] = 16 Long Street , [ “phone”] = 123456, [ “name”] = Wilma,}, [3] = {[ “address”] = 17 Long Street, [ “phone”] = 123457, [ “name”] = Barney, },}
답변
이것을 찾았습니다 :
-- Print contents of `tbl`, with indentation.
-- `indent` sets the initial level of indentation.
function tprint (tbl, indent)
if not indent then indent = 0 end
for k, v in pairs(tbl) do
formatting = string.rep(" ", indent) .. k .. ": "
if type(v) == "table" then
print(formatting)
tprint(v, indent+1)
elseif type(v) == 'boolean' then
print(formatting .. tostring(v))
else
print(formatting .. v)
end
end
end
여기에서
https://gist.github.com/ripter/4270799
나에게 꽤 잘 작동합니다 …
답변
내가 본 대부분의 순수한 lua 인쇄 테이블 함수는 깊은 재귀에 문제가 있으며 너무 깊어지면 스택 오버플로를 일으키는 경향이 있습니다. 내가 작성한이 인쇄 테이블 함수에는이 문제가 없습니다. 또한 연결을 처리하는 방식으로 인해 정말 큰 테이블을 처리 할 수 있어야합니다. 이 기능을 개인적으로 사용했을 때 약 1 초 만에 63k 줄을 출력했습니다.
출력은 또한 lua 구문을 유지하며 숫자, 부울, 문자열 및 테이블 데이터 유형 만 형식화 할 수 있도록 수정 된 경우 출력을 파일에 기록하여 스크립트를 쉽게 수정하여 간단한 영구 저장을 수행 할 수 있습니다.
function print_table(node)
local cache, stack, output = {},{},{}
local depth = 1
local output_str = "{\n"
while true do
local size = 0
for k,v in pairs(node) do
size = size + 1
end
local cur_index = 1
for k,v in pairs(node) do
if (cache[node] == nil) or (cur_index >= cache[node]) then
if (string.find(output_str,"}",output_str:len())) then
output_str = output_str .. ",\n"
elseif not (string.find(output_str,"\n",output_str:len())) then
output_str = output_str .. "\n"
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output,output_str)
output_str = ""
local key
if (type(k) == "number" or type(k) == "boolean") then
key = "["..tostring(k).."]"
else
key = "['"..tostring(k).."']"
end
if (type(v) == "number" or type(v) == "boolean") then
output_str = output_str .. string.rep('\t',depth) .. key .. " = "..tostring(v)
elseif (type(v) == "table") then
output_str = output_str .. string.rep('\t',depth) .. key .. " = {\n"
table.insert(stack,node)
table.insert(stack,v)
cache[node] = cur_index+1
break
else
output_str = output_str .. string.rep('\t',depth) .. key .. " = '"..tostring(v).."'"
end
if (cur_index == size) then
output_str = output_str .. "\n" .. string.rep('\t',depth-1) .. "}"
else
output_str = output_str .. ","
end
else
-- close the table
if (cur_index == size) then
output_str = output_str .. "\n" .. string.rep('\t',depth-1) .. "}"
end
end
cur_index = cur_index + 1
end
if (size == 0) then
output_str = output_str .. "\n" .. string.rep('\t',depth-1) .. "}"
end
if (#stack > 0) then
node = stack[#stack]
stack[#stack] = nil
depth = cache[node] == nil and depth + 1 or depth - 1
else
break
end
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output,output_str)
output_str = table.concat(output)
print(output_str)
end
다음은 예입니다.
local t = {
["abe"] = {1,2,3,4,5},
"string1",
50,
["depth1"] = { ["depth2"] = { ["depth3"] = { ["depth4"] = { ["depth5"] = { ["depth6"] = { ["depth7"]= { ["depth8"] = { ["depth9"] = { ["depth10"] = {1000}, 900}, 800},700},600},500}, 400 }, 300}, 200}, 100},
["ted"] = {true,false,"some text"},
"string2",
[function() return end] = function() return end,
75
}
print_table(t)
산출:
{
[1] = 'string1',
[2] = 50,
[3] = 'string2',
[4] = 75,
['abe'] = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
[5] = 5
},
['function: 06472B70'] = 'function: 06472A98',
['depth1'] = {
[1] = 100,
['depth2'] = {
[1] = 200,
['depth3'] = {
[1] = 300,
['depth4'] = {
[1] = 400,
['depth5'] = {
[1] = 500,
['depth6'] = {
[1] = 600,
['depth7'] = {
[1] = 700,
['depth8'] = {
[1] = 800,
['depth9'] = {
[1] = 900,
['depth10'] = {
[1] = 1000
}
}
}
}
}
}
}
}
}
},
['ted'] = {
[1] = true,
[2] = false,
[3] = 'some text'
}
}
답변
앞에서 언급했듯이 작성해야합니다. 내 겸손한 버전은 다음과 같습니다. (슈퍼 기본 버전)
function tprint (t, s)
for k, v in pairs(t) do
local kfmt = '["' .. tostring(k) ..'"]'
if type(k) ~= 'string' then
kfmt = '[' .. k .. ']'
end
local vfmt = '"'.. tostring(v) ..'"'
if type(v) == 'table' then
tprint(v, (s or '')..kfmt)
else
if type(v) ~= 'string' then
vfmt = tostring(v)
end
print(type(t)..(s or '')..kfmt..' = '..vfmt)
end
end
end
예:
local mytbl = { ['1']="a", 2, 3, b="c", t={d=1} }
tprint(mytbl)
출력 (Lua 5.0) :
table[1] = 2
table[2] = 3
table["1"] = "a"
table["t"]["d"] = 1
table["b"] = "c"
답변
table.tostring
의 metehod metalua은 실제로 매우 완료됩니다. 중첩 된 테이블을 처리하고 들여 쓰기 수준은 변경 가능합니다. https://github.com/fab13n/metalua/blob/master/src/lib/metalua/table2.lua 참조