Функции перегрузки - PullRequest
       11

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

17 голосов
/ 25 декабря 2011

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

Ответы [ 2 ]

21 голосов
/ 26 декабря 2011

Короче говоря: нет, это невозможно.

Однако вы можете имитировать такой тип поведения:

Очевидно, поскольку 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 голосов
/ 11 августа 2015

Правильный ответ уже дал Андрей. Тем не менее, я проводил некоторые эксперименты в течение некоторого времени, и я хотел бы показать, что я считаю еще одним относительно простым способом, который имеет некоторые преимущества. Кроме того, это метод, который 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 вместо непосредственного использования переменных

...