Подтвердить что ты не робот

Функции перегрузки

Есть ли способ иметь две функции с тем же именем, но с разными аргументами внутри одного класса в Matlab?

4b9b3361

Ответ 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 вместо непосредственного использования переменных