EDIT: После получения очаровательных комментариев на моем первое решение, я предлагаю другой, который нуждается в большем количестве редактирования в вашем коде, чем первый, но все же меньше, чем другие решения до сих пор (переместила оригинал до конца):
Давайте определим функцию, которая захватывает значения и сохраняет их в постоянной переменной
function list = cc(value)
persistent allCases
if isempty(allCases) || (nargin == 0 && nargout == 0)
allCases = {};
end
if nargin == 1,
allCases = [allCases value];
list = value;
end
if nargin == 0 && nargout == 1,
list = allCases;
end
end
Теперь вы можете просто добавить cc;
перед тем switch
сбросить постоянную переменную и передать все значения в case
стат ements к функции и вызовите функцию в otherwise
частях, чтобы прочитать значение:
a = 'a';
v = 'c';
cc;
switch a
case cc({'b' v 1.2})
%Multiple cases
case cc(2)
%number
case cc(ones(2))
%matrix
otherwise
disp('Allowed cases are:');
cellfun(@disp, cc);
end
Это печатает:
Allowed cases are:
b
c
1.2000
2
1 1
1 1
Рискованное решение: Это решение, вероятно, нарушает довольно много методов программирования, но все еще работает как хак. Предполагая, что вы не гнездились switch
заявления, то вы можете вызвать функцию, как это в otherwise
заявлении:
function allCases = getCases
st = dbstack('-completenames');
line = st(2).line;
fLines = importdata(st(2).file, sprintf('\n'));
switchLine = find(~cellfun(@isempty, ...
regexp(fLines(1:line-1), '^\s*switch\s', 'once')), 1, 'last');
otherwLine = find(~cellfun(@isempty, ...
regexp(fLines(1:line-1), '^\s*otherwise\s*$', 'once')), 1, 'last');
caseLines = fLines(switchLine+1:otherwLine-1);
casesStr = regexprep(caseLines(~cellfun(@isempty, ...
regexp(caseLines, '^\s*case\s', 'once'))), '^\s*case\s*', '');
casesCells = cell(size(casesStr));
for iCases = 1:numel(casesCells);
casesCells{iCases} = evalin('caller', casesStr{iCases});
end
allCases = [casesCells{:}];
end
Затем, если вы запустите код, как этот
a = 'a';
v = 'c';
switch a
case {'b' v 1.2}
%Multiple cases
case 2
%number
case ones(2)
%matrix
otherwise
disp('Allowed cases are:');
cellfun(@disp, getCases);
end
он печатает
Allowed cases are:
b
c
1.2000
2
1 1
1 1
Вы можете найти [это] (http://www.mathworks.com/matlabcentral/fileexchange/44203-getcases-list-of-all-cases-in-a-switc h) интересно :) –
Очень приятно! Я вижу, что вы в конечном итоге пошли с версией метода ужаса @ mohsennosratina :). Один комментарий. Исправьте меня, если я ошибаюсь, но этот код не сработает, если вы выделите раздел кода и нажмите F9 или выполните раздел кода с помощью Shift + Enter, если вы не сохранили файл до этого. – craigim
Это действительно так; он должен быть запущен из файла. Я не мог понять, как это сделать иначе, не устанавливая требования к тому, как вы должны кодировать «переключатель» ... Возможно, когда-нибудь я знаю, как избавиться от этой зависимости :) Когда я это сделаю, я позволю вам знать. –