Правильный ответ уже дал Андрей. Тем не менее, я проводил некоторые эксперименты в течение некоторого времени, и я хотел бы показать, что я считаю еще одним относительно простым способом, который имеет некоторые преимущества. Кроме того, это метод, который MATLAB довольно часто использует для своих встроенных функций.
Я имею в виду такой способ передачи аргументов ключ-значение:
x = 0:pi/50:2*pi;
y = sin(x);
plot(x, y, 'Color', 'blue', 'MarkerFaceColor', 'green');
Существует множество способов синтаксического анализа массива ячеек varargin
, но самый чистый способ сделать это, который я до сих пор нашел, использует класс MATLAB inputParser
.
Пример:
function makeSandwiches(amount, varargin)
%// MAKESANDWICHES Make a number of sandwiches.
%// By default, you get a ham and egg sandwich with butter on white bread.
%// Options:
%// amount : number of sandwiches to make (integer)
%// 'butter' : boolean
%// 'breadType' : string specifying 'white', 'sourdough', or 'rye'
%// 'topping' : string describing everything you like, we have it all!
p = inputParser(); %// instantiate inputParser
p.addRequired('amount', @isnumeric); %// use built-in MATLAB for validation
p.addOptional('butter', 1, @islogical);
p.addOptional('breadType', 'white', ... %// or use your own (anonymous) functions
@(x) strcmp(x, 'white') || strcmp(x, 'sourdough') || strcmp(x, 'rye'));
p.addOptional('toppings', 'ham and egg', @(x) ischar(x) || iscell(x))
p.parse(amount, varargin{:}); %// Upon parsing, the variables are
%// available as p.Results.<var>
%// Get some strings
if p.Results.amount == 1
stringAmount = 'one tasty sandwich';
else
stringAmount = sprintf('%d tasty sandwiches', p.Results.amount);
end
if p.Results.butter
stringButter = 'with butter';
else
stringButter = 'without butter';
end
%// Make the sandwiches
fprintf(['I made you %s %s from %s bread with %s and taught you ' ...
'something about input parsing and validation in MATLAB at ' ...
'the same time!\n'], ...
stringAmount, stringButter, p.Results.breadType, p.Results.toppings);
end
(косится после комментариев, потому что SO не поддерживает подсветку синтаксиса MATLAB)
Дополнительные преимущества этого метода:
- Возможность установить значения по умолчанию (например, Python, где вы можете установить arg=val
в сигнатуре функции)
- Возможность простой проверки ввода
- Вам нужно только запомнить названия опций, а не их порядок, так как порядок не имеет значения
Downsides:
- могут быть некоторые издержки, которые могут стать значительными при выполнении многих вызовов функций, и не намного (не проверено)
- вы должны использовать свойство Results
из класса inputParser
вместо непосредственного использования переменных