На прошлой неделе друг спросил меня, как перечислить или перечислить все переменные в программе / функции / и т. Д. для целей отладки (по сути, получение снимка всего, чтобы вы могли видеть, какие переменные установлены, или установлены ли они вообще). Я немного огляделся и нашел относительно хороший способ для Python:
#! / usr / bin / python foo1 = "Привет, мир" foo2 = "бар" foo3 = {"1": "а", "2": "b"} foo4 = "1 + 1" для имени в dir (): myvalue = eval (имя) напечатать имя, «есть», тип (имя), «и равно», myvalue
что выведет что-то вроде:
__builtins__ - это <тип 'str'> и равно <модуль '__builtin__' (встроенный)> __doc__ имеет значение <type 'str'> и равно None __file__ - это <тип 'str'> и равно ./foo.py __name__ - это <тип 'str'> и равно __main__ foo1 - это <type 'str'> и равно Hello world foo2 - это <type 'str'> и равно bar foo3 - это <type 'str'> и равно {'1': 'a', '2': 'b'} foo4 имеет значение <type 'str'> и равно 1 + 1
До сих пор я частично нашел способ в PHP (любезно предоставлен текст ссылки ), но он перечисляет только все переменные и их типы, а не содержимое:
<? php // создаем несколько переменных $ bar = 'foo'; $ foo = 'бар'; // создаем новый объект массива $ arrayObj = новый объект ArrayObject (get_defined_vars ()); // цикл по объекту массива и эхо-переменным и значениям for ($ iterator = $ arrayObj-> getIterator (); $ iterator-> valid (); $ iterator-> next ()) { эхо $ итератор-> ключ (). '=>'. $ итератор-> текущий (). '<br />'; } ?>
Итак, я задаю вам вопрос: как вы перечисляете все переменные и их содержимое на вашем любимом языке?
Редактировать VonC : Я предлагаю, что этот вопрос следует духу небольшого « вызова кода ».
Если вы не согласны, просто отредактируйте и удалите тег и ссылку.
Ответы:
В python использование locals, которое возвращает словарь, содержащий все локальные привязки, таким образом избегая eval:
источник
Вот как это будет выглядеть в Ruby :
который выведет
Однако разве вы не имели в виду выводить тип объекта, на который ссылается переменная, вместо типа, используемого для представления идентификатора переменной? IOW, тип
foo3
должен бытьHash
(илиdict
) вместоString
, верно? В этом случае код будети результат
источник
instance_variable_get(instance_variables[0])
IPython:
Вы также можете порекомендовать своему другу Spyder, который показывает эти переменные почти так же, как Matlab, и предоставляет графический интерфейс для построчной отладки.
источник
В php вы можете сделать это:
источник
В Lua фундаментальной структурой данных является таблица, и даже глобальная среда _G - это таблица. Итак, простое перечисление поможет.
источник
Баш:
Отказ от ответственности: не мой любимый язык!
источник
env
чтобы узнать, что значения не экспортированы.Полностью рекурсивный однострочник PHP:
источник
Во-первых, я бы просто использовал отладчик; например, в Visual Studio есть окна «Локальные» и «Наблюдение», в которых будут отображаться все переменные и т. Д., Которые вы хотите, полностью расширяемые до любого уровня.
В C # вы не можете легко получить доступ к переменным метода (и многие из них могут быть удалены компилятором), но вы можете получить доступ к полям и т. Д. Через отражение:
источник
Perl. Не обрабатывает
my
локальные переменные и не отфильтровывает некоторые бесполезные ссылки, но все в области пакета можно увидеть.источник
Matlab:
источник
На языке R
и удалить все объекты из рабочей памяти
источник
В java проблема будет похожа на C #, только в более подробном режиме (я знаю, я ЗНАЮ ;) Java многословна ... вы уже ясно дали понять;) )
Вы можете получить доступ к полям объекта через Refection, но вы не можете легко получить доступ к локальным переменным метода. Таким образом, следующее предназначено не для кода статического анализа, а только для отладки во время выполнения.
источник
AccessController
не нужна в автономном приложении (ну, вsetAccessible
любомif
случае, не требуется для доступа к вашим собственным полям) или утверждение, чтобы различать два случая, которые могут быть обработаны таким же образом при удалении устаревшегоtoString()
вызова:System.out.println(aField.getName() + ": " + res);
работает независимо от того,res
есть онnull
или нет. И нет необходимости распространять код на несколько методов…В REBOL все переменные находятся в контексте типа
object!
. Есть глобальный контекст, и каждая функция имеет свой собственный неявный локальный контекст. Вы можете создавать новые контексты явно, создавая новыйobject!
(или используяcontext
функцию). Это отличается от традиционных языков, потому что переменные (называемые «словами» в REBOL) несут ссылку на свой контекст вокруг себя, даже когда они покинули «область действия», в которой они были определены.Итак, суть в том, что, учитывая контекст, мы можем перечислить переменные, которые он определяет. Воспользуемся функцией Ладислава Мечира
context-words?
.Теперь мы можем перечислить все слова, определенные в глобальном контексте. (Их очень много .)
Мы также можем написать функцию, которая затем перечислит переменные, которые она определяет.
Что мы Насколько я знаю, в REBOL не можем пройти вверх по контекстному дереву, хотя интерпретатор, кажется, может делать это отлично, когда решает, как связать слова с их контекстами. Я думаю, это связано с тем, что контекстное дерево (т.е. область видимости) может иметь одну «форму» во время связывания слова, но совсем другую во время его оценки.
источник
Быстрое и грязное решение JavaScript, если у вас установлен FireBug (или другой браузер с console.log). Если вы этого не сделаете, вам придется изменить console.log на document.write и запустить его как встроенный скрипт в конце вашего. Измените MAX_DEPTH на желаемое количество уровней рекурсии (будьте осторожны!).
источник
Общий Лисп:
Чтобы также показать все связанные значения:
Это длинный список, и он не особо полезен. Я бы действительно использовал встроенный отладчик.
источник
Вот идея для oo-languages.
Сначала вам нужно что-то вроде toString () в Java для печати значимого содержимого. Во-вторых, вы должны ограничиться одной иерархией объектов. В конструкторе корневого объекта (например, Any в Eiffel) вы регистрируете экземпляр при создании в каком-то глобальном списке. Во время уничтожения вы отменяете регистрацию (обязательно используйте некоторую структуру данных, которая позволяет быстро вставлять / искать / удалять). В любой момент во время выполнения программы вы можете пройти через эту структуру данных и распечатать все зарегистрированные в ней объекты.
Благодаря своей структуре Эйфель может быть очень хорош для этой цели. Другие языки имеют проблемы с объектами, которые не определены пользователем (например, jdk-классы). В Java можно было бы создать свой собственный объектный класс, используя некоторый открытый исходный код jdk.
источник