Есть ли способ иметь две функции с тем же именем, но с разными аргументами внутри одного класса в Matlab?
Функции перегрузки
Ответ 1
Короче: Нет, это невозможно.
Однако вы можете имитировать такое поведение:
Очевидно, что поскольку Matlab является динамическим языком, вы можете передавать аргументы любого типа и проверять их.
function foo(x)
if isnumeric(x)
disp(' Numeric behavior');
elseif ischar(x)
disp(' String behavior');
end
end
Вы также можете использовать varargin, а также проверить количество параметров и изменить поведение
function goo(varargin)
if nargin == 2
disp('2 arguments behavior');
elseif nargin == 3
disp('3 arguments behavior');
end
end
Ответ 2
Правильный ответ уже дал Андрей. Тем не менее, я уже некоторое время экспериментировал с некоторыми экспериментами, и я хотел бы показать, что я считаю другим относительно простым способом, который имеет некоторые преимущества. Кроме того, это метод, который 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
вместо непосредственного использования переменных