попытка напечатать _G не работает - PullRequest
3 голосов
/ 25 августа 2011

Согласно документации _G "содержит глобальную среду". Я хотел посмотреть, что внутри, поэтому я написал следующий код для печати _G, но он не работает:

function f(x)
    return 2*x
end
a=3
b="hello world"
print("_G has "..#_G.." elements")
for k,v in pairs(_G) do
    print(k)
    print(_G[k])
    print("G["..k.."]=".._G[k])
end

Ошибка:

_G has 0 elements
a
3
G[a]=3
string
table: 003C8448
lua: try_G.lua:10: attempt to concatenate field '?' (a table value)
stack traceback:
    try_G.lua:10: in main chunk
    [C]: ?
>Exit code: 1

Ответы [ 4 ]

4 голосов
/ 26 августа 2011

Вы также можете использовать функцию table.foreach(t,f).Он перебирает таблицу t, вызывая функцию f с каждой парой ключ-значение.Используйте с print для быстрого просмотра:

table.foreach(_G,print)

Это очень удобно в интерактивном режиме, поскольку оно достаточно лаконично и достаточно просто для ввода.

C:\Users\Ross>lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> table.foreach(_G,print)
string  table: 005CE3D0
xpcall  function: 00717E80
package table: 005CE088
tostring        function: 00717DE0
print   function: 00711CB8
os      table: 005CE358
unpack  function: 00717E40
require function: 00718360
getfenv function: 00711B58
setmetatable    function: 00717DA0
next    function: 00711C38
assert  function: 00711A38
tonumber        function: 00717DC0
io      table: 005CE218
rawequal        function: 00711CF8
collectgarbage  function: 00711A78
getmetatable    function: 00711B98
module  function: 00718320
rawset  function: 00711D58
math    table: 005CE448
debug   table: 005CE498
pcall   function: 00711C78
table   table: 005CE128
newproxy        function: 00711E10
type    function: 00717E00
coroutine       table: 005CDFE8
_G      table: 00713EC8
select  function: 00711D98
gcinfo  function: 00711B18
pairs   function: 00711F98
rawget  function: 00711D18
loadstring      function: 00711C18
ipairs  function: 00711F68
_VERSION        Lua 5.1
dofile  function: 00711A98
setfenv function: 00717D60
load    function: 00711BD8
error   function: 00711AD8
loadfile        function: 00711BB8
>

Обновление: К сожалению, как напоминает мне Александр Гладыш, функция table.foreach устарела в Lua 5.1, и быстрая проверка текущей бета-версии 5.2 показывает, что онабыл удален в Lua 5.2.Легко написать тот же цикл в терминах pairs:

for k,v in pairs(_G) do print(k,v) end

, который должен давать тот же результат, что и table.foreach(_G,print).Ключевая особенность, на которую я здесь опираюсь, заключается в том, что print определен для вызова tostring() для каждого передаваемого аргумента, а tostring() определен для возврата какой-либо разумной строки для каждого вида значения, даже таких какфункции, которые не имеют хорошего представления в виде строки.Детали будут различаться для каждой платформы, но реализация по умолчанию tostring() включает адрес таблицы или функции в ее строковый результат, что позволяет вам по крайней мере признать, что _G.os и _G.io * различаются таблицы.

Для более удобной печати таблиц существует множество решений - от примеров в PiL до нескольких постоянных библиотек данных.Лично мне нравится функция pl.pretty.write(), предоставляемая библиотекой Стива Донавана .

3 голосов
/ 25 августа 2011

Ваш код работает точно так, как ожидалось - он проходит по _G и пытается распечатать содержимое.К сожалению, _G содержит много таблиц, которые нельзя объединить в строку.Код не выполняется, потому что _G ["_ G"] = _G.Это означает, что когда интерпретатор приходит к

print("G["..k.."]=".._G[k])

, тогда k - это «_G», а _G [k] - это _G, и вы пытаетесь объединить таблицу, чего интерпретатор не может сделать, поэтому он умираетна тебе.В _G есть множество других таблиц, которые также могут вызвать эту ошибку.

2 голосов
/ 25 августа 2011

Чтобы следить за DeadMG, измените свой

print("G["..k.."]=".._G[k])

до

print("G["..k.."]=",_G[k])

и с тобой все будет в порядке.

1 голос
/ 25 августа 2011

Вот окончательный код, использующий решение DeadMG:

function f(x)
    return 2*x
end
a=3
b="hello world"
print("_G has "..#_G.." elements")
for k,v in pairs(_G) do
    if k~="_G" then
        if type(v)=="string" or type(v)=="number" then
            print("G["..k.."]="..v)
        else
            print("G["..k.."]=("..type(v)..")")
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...