編集:私の最初の解決策について魅力的なコメントを受け取った後、最初の解決策よりもコードを編集する必要があるが、これまでのところ他の解決策よりも少ない別の解決策を提案します(元の解決策を最後に移動しました):
値を取得して永続変数に保持する関数を定義しましょう
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;
beforeを追加しswitch
て永続変数をリセットし、case
ステートメント内のすべての値を関数に渡し、その部分で関数を呼び出して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