Как определить сценарий, который создал конкретную переменную рабочей области? - PullRequest
9 голосов
/ 16 мая 2019

Я изучаю существующий код, который выдает множество различных переменных. Моя цель - определить переменную в рабочей области и локализовать скрипт, который создал эту переменную.

Мне нужно локализовать скрипт, потому что в коде у меня есть скрипт, который вызывает остальные три скрипта. По этой причине сложно определить сценарий, который произвел конкретную переменную. Кроме того, три кода очень длинные.

Как я могу определить исходный скрипт на основе только переменных рабочей области?

Ответы [ 2 ]

8 голосов
/ 16 мая 2019

У меня недавно была похожая проблема, поэтому я вместе взломал быструю функцию, которая будет определять вновь созданные переменные на основе исходного состояния.

function names2 = findNewVariables(state)

persistent names1

if state == 1
    % store variables currently in caller workspace
    names1 = evalin('caller', 'who');
    names2 = [];

elseif state == 2
    % which variables are in the caller workspace in the second call
    names2 = evalin('caller', 'who');

    % find which variables are new, and filter previously stored
    ids = ismember(names2,names1) ~= 1;
    names2(~ids) = [];
    names2(strcmp(names2, 'names1')) = [];
    names2(strcmp(names2, 'names2')) = [];
    names2(strcmp(names2, 'ans')) = [];
end

Чтобы использовать это, сначала инициализируйте функцию с аргументом 1, чтобы получить переменные, которые в данный момент находятся в рабочей области: findNewVariables(1). Затем запустите некоторый код, скрипт, что угодно, что создаст некоторые переменные в рабочей области. Затем снова вызовите функцию и сохраните ее вывод следующим образом: new_vars = findNewVariables(2). new_vars - это массив ячеек, содержащий имена вновь созданных переменных.

Пример:

% make sure the workspace is empty at the start
clear

a = 1;

% initialize the function
findNewVariables(1);

test   % script that creates b, c, d;

% store newly created variable names
new_vars = findNewVariables(2);

Что приведет к:

>> new_vars

new_vars =

  3×1 cell array

    {'b'}
    {'c'}
    {'d'}

Примечание , при этом будут обнаружены только вновь созданные переменные (следовательно, clear требуется в начале скрипта), а не обновленные / перезаписанные переменные.

4 голосов
/ 16 мая 2019

Вы можете использовать для этого exist.Примерно:

assert( ~exist('varName', 'var'), 'Variable exists!');

script1(in1, in2);
assert( ~exist('varName', 'var'), 'Variable exists!');

script2(in1, in2);
assert( ~exist('varname', 'var'), 'Variable exists!');

Когда утверждение не выполняется, это означает, что переменная была создана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...