Валидация аргумента функции

Введение в валидацию аргумента

Валидация аргумента функции является способом объявить определенные ограничения на входные аргументы функции. Используя валидацию аргумента можно ограничить класс, размер и другие аспекты значений входного параметра функции без написания кода в теле функции выполнять эти тесты.

Валидация аргумента функции декларативна, который позволяет инструментам рабочего стола MATLAB® извлечь информацию о функции контролем определенных блоков кода. Путем объявления требований для входных параметров можно устранить громоздкий код проверки аргументов и улучшить удобочитаемость, робастность и поддерживаемость кода.

Синтаксис валидации аргумента функции упрощает процесс определения дополнительного, повторение и аргументы значения имени. Кроме того, это позволяет вам задать значения по умолчанию сопоставимым способом.

Где использовать валидацию аргумента

Использование валидации аргумента функции является дополнительным в функциональных определениях. Валидация аргумента является самой полезной в функциях, которые могут быть вызваны любым кодом и где валидность входных параметров должна быть определена прежде, чем выполнить функциональный код. Функции, которые спроектированы для использования другими, могут извлечь выгоду из соответствующего уровня ограничения на входные параметры аргумента и возможность возвратить определенные сообщения об ошибке на основе входных параметров к функциям.

Где валидация не нужна

В локальных и закрытых функциях, и в закрытых или защищенных методах, вызывающая сторона знает о входных требованиях, таким образом, эти типы функций могут быть вызваны допустимыми аргументами.

Где валидация не позволена

Вы не можете использовать синтаксис валидации аргумента во вложенных функциях, абстрактных методах или методах деструктора класса Handle. Для получения дополнительной информации о валидации аргумента в методах смотрите Валидацию Аргумента в Методах класса.

arguments Блокируйте синтаксис

Валидация аргумента define функций в блоках кода, которые разграничены ключевыми словами arguments и end. Если используется, arguments блок должен запуститься перед первой исполняемой линией функции.

Можно использовать несколько arguments блоки в функции, но все блоки должны произойти перед любым кодом, который не является частью arguments блок.

Подсвеченная область в следующем коде показывает синтаксис для валидации аргумента.

Объявление аргумента функции может включать любой из этих видов ограничений:

  • Размер — длина каждой размерности, заключенной в круглые скобки

  • Класс — имя одного класса MATLAB

  • Функции — список, разделенный запятыми функций валидации, заключенных в фигурные скобки

Можно задать значение по умолчанию для входного параметра в функциональном объявлении валидации для того аргумента. Убедитесь, что значение по умолчанию удовлетворяет заявленным ограничениям для того аргумента.

Размер

Размер валидации является размерностями входного параметра, заданного с неотрицательными целыми числами или двоеточиями (:). Двоеточие указывает, что любая длина позволена в той размерности. Вы не можете использовать выражения в размерностях. Значение, присвоенное аргументу в вызове функции, должно быть совместимо с заданным размером, или MATLAB выдает ошибку.

Индексированные правила присвоения MATLAB применяются к спецификациям размера. Например, значение 1 на 1 совместимо с размером, заданным как (5,3), потому что MATLAB применяет скалярное расширение. Кроме того, преобразование столбца строки MATLAB применяется так, чтобы размер задал как (1,:)может принять размер 1 на n и n-1.

Вот некоторые примеры:

  • (1,1) должно быть точно 1 на 1

  • (3,:) первая размерность должна быть 3, второе измерение может быть любым значением

  • Если вы не задаете размер, то любой размер позволен, если не ограничено функциями валидации.

Класс

Класс валидации является именем единого класса. Значение, присвоенное входному параметру функции, должно иметь заданный класс или конвертируемо к заданному классу. Используйте любой класс MATLAB или внешне заданный класс, который поддерживается MATLAB, кроме Java, COM-классов и классов MATLAB, заданных перед Версией 7.6 программного обеспечения MATLAB (определения классов, которые не используют classdef ключевое слово).

Вот некоторые примеры:

  • char - введите должен иметь класс char, или значение, которое MATLAB может преобразовать в char, такой как string.

  • double числовое значение любой точности

  • cell массив ячеек

  • Пользовательский класс, такой как класс перечисления, может ограничить входные параметры более определенными значениями и позволяет вам управлять тем, какие преобразования поддерживаются.

  • Если вы не задаете класс, то любой класс позволен, если не ограничено функциями валидации.

Функции валидации

Функцией валидации является функция MATLAB, которая выдает ошибку, если определенным требованиям не удовлетворяет значение аргумента. Функции валидации не делают возвращаемых значений и, в отличие от класса и размера, не может вызвать изменения в значении аргумента, который это подтверждает.

Во время процесса валидации MATLAB передает значение аргумента каждой функции валидации, перечисленной для того аргумента. MATLAB вызывает каждую функцию слева направо и выдает первую ошибку, с которой сталкиваются.

Значение, переданное функциям валидации, является результатом любого преобразования, сделанного спецификациями размера и классом.

Для таблицы предопределенных функций валидации смотрите Функции Валидации Аргумента.

Значение по умолчанию

Значением по умолчанию аргумента может быть любая константа или выражение, которое удовлетворяет размеру, классу и требованиям функции валидации. Определение значения по умолчанию в объявлении аргумента приводит дополнительный аргумент. MATLAB использует значение по умолчанию, когда аргумент не включен в вызов функции. Выражения значения по умолчанию выполнены каждый раз, когда значение по умолчанию используется.

Примечание

Поскольку MATLAB подтверждает значение по умолчанию только, когда функция вызвана без значения для аргумента, недопустимое значение по умолчанию вызывает ошибку только, когда функция вызвана без того аргумента.

Дополнительные аргументы должны быть расположены после обязательных аргументов в функциональной подписи и в arguments блок. Для получения дополнительной информации о дополнительных аргументах смотрите Необходимые и Дополнительные Позиционные параметры.

Последовательность валидации

Аргументы подтверждены сверху донизу в arguments блок. MATLAB подтверждает каждую часть объявления аргумента в определенном порядке. Сначала класс подтвержден, затем размер. Результат класса и валидаций размера передается функциям валидации. Каждый шаг является дополнительным в зависимости от того, являются ли класс, размер и функции валидации в объявлении аргумента.

Для получения дополнительной информации смотрите Порядок Валидации Аргумента.

Преобразование в заявленный класс и размер

И валидация класса и валидация размера могут изменить значение входного параметра из-за стандартных правил преобразования MATLAB. Поэтому подтвержденное значение в теле функции может отличаться от значения, переданного при вызывании функции. Правила преобразования выведены из правил, что MATLAB запрашивает индексируемое присвоение формы:

A(indices) = value

MATLAB может решить, что значение левой стороны имеет требования для класса и размера и, в определенных случаях, может преобразовать значение правой стороны, чтобы быть необходимого класса и размера.

Для сопутствующей информации смотрите Преобразования Класса и Размера Предотвращения.

Примеры валидации аргумента

Этот arguments блок задает размер и класс трех входных параметров.

function out = myFunction(A, B, C)   
    arguments
        A (1,1) string 
        B (1,:) double
        C (2,2) cell
    end

    % Function code
    ...
end

В этой функции переменные имеют следующее объявление:

  • A скаляр строки.

  • B 1-any вектор длины, удваивается.

  • C массив ячеек 2 на 2.

Преобразование значения

Следующая функция иллюстрирует, как входные параметры могут быть преобразованы, чтобы совпадать с классами, заданными в arguments блок. SpeedEnum класс является классом перечисления, созданным, чтобы задать значения, допускал третий входной параметр.

function forwardSpeed(a,b,c)
    arguments
        a double
        b char
        c SpeedEnum
    end

    % Function code
    disp(class(a))
    disp(class(b))
    disp(class(c))
end

Вот класс перечисления.

classdef SpeedEnum < int32
    enumeration
        Full   (100)
        Half   (50)
        Stop   (0)
    end
end

Этот вызов функции использует входные значения, которые MATLAB может преобразовать в заявленные типы. Фактические типы аргумента в функции отображены, как выведено.

forwardSpeed(int8(4),"A string",'full')
double
char
SpeedEnum

Определенные ограничения Используя функции валидации

Функции валидации могут ограничить входные параметры в более особенных методах. Можно использовать предопределенные функции валидации во многих общих видах валидации, и можно задать собственную функцию валидации, чтобы удовлетворить конкретным требованиям.

Например, эта функция задает следующие валидации с помощью mustBeNumericmustBeRealmustBeMember, и локальная функция mustBeEqualSize.

  • Введите x должен быть действительный, числовой вектор-строка из любой длины.

  • Введите v должен быть действительный, числовой вектор-строка тот же размер как x.

  • Введите method должен быть вектор символов, который является одним из трех позволенных вариантов. Поскольку method задает значение по умолчанию, этот аргумент является дополнительным.

function myInterp(x,v,method)
    arguments
        x (1,:) {mustBeNumeric,mustBeReal}
        v (1,:) {mustBeNumeric,mustBeReal,mustBeEqualSize(v,x)}
        method (1,:) char {mustBeMember(method,{'linear','cubic','spline'})} = 'linear'
    end
    % Function code
    ....
end

% Custom validation function
function mustBeEqualSize(a,b)
    % Test if a and b have equal size 
    if ~isequal(size(a),size(b))
        error('Size of first input must equal size of second input')
    end
end

Избегайте использования валидации аргумента функции в пользовательских функциях валидации. Для получения дополнительной информации об определении функций валидации и для списка предопределенных функций валидации, смотрите Функции Валидации Аргумента.

Виды аргументов

Валидация аргумента функции может объявить четыре вида аргументов. Функции могут задать любой из этих видов аргументов, но аргументы должны быть заданы в следующем порядке:

  1. Необходимые позиционные параметры

  2. Дополнительные позиционные параметры

  3. Повторение позиционных параметров

  4. Дополнительные аргументы значения имени

Требуемые и дополнительные позиционные параметры

Позиционные параметры должны быть переданы функции в определенном порядке. Положение значения, переданного в списке аргументов, должно соответствовать порядку, которым аргумент объявляется в arguments блок. Все имена аргумента в arguments блок должен быть уникальным.

Позиционные параметры в arguments блок требуется при вызывании функции, если аргумент не задает значение по умолчанию. Определение значения по умолчанию в объявлении аргумента приводит позиционный аргумент, дополнительный, потому что MATLAB может использовать значение по умолчанию, когда никакое значение не передается в вызове функции.

Значением по умолчанию может быть константа или выражение, которое приводит к результату, который удовлетворяет объявлению аргумента. Выражение может относиться к аргументам, которые объявляются перед ним в arguments блокируйтесь, но не аргументы, которые объявляются после него.

MATLAB выполняет выражение значения по умолчанию только, когда аргумент не включен в вызов функции.

Все дополнительные аргументы должны быть расположены после всех обязательных аргументов в arguments блок. Например, в этом блоке аргумента, maxlen и minlen имейте значения по умолчанию, и являются поэтому дополнительными.

function myFunction(x,y,maxval,minval)
    arguments
        x (1,:) double
        y (1,:) double
        maxval (1,1) double = max(max(x),max(y))
        minval (1,1) double = min(min(x),min(y))
    end

    % Function code
    ....
end

Можно вызвать эту функцию с этими аргументами:

myFunction(x,y,maxval,minval) 
myFunction(x,y,maxval) 
myFunction(x,y) 

Дополнительный позиционный параметр становится необходимым, когда его положение должно быть заполнено в вызове функции идентифицировать аргументы, которые прибывают после него. Таким образом, если вы хотите задать значение для minlen, необходимо задать значение для maxlen.

Проигнорированные позиционные параметры

MATLAB позволяет вам проигнорировать входные параметры путем передачи символа тильды (~) вместо аргумента. Можно задать функцию, которая игнорирует неиспользованные позиционные параметры путем добавления символа тильды (~) в блоке аргументов, соответствующем положению аргумента в функциональной подписи. Добавьте символ тильды (~) для каждого проигнорированного аргумента в функциональной подписи.

Проигнорированные аргументы не могут иметь значений по умолчанию или задать класс, размер или функции валидации.

Символ тильды (~) обработан как дополнительный входной параметр, если он не сопровождается необходимым позиционным параметром. Например, в этой функции символ тильды (~) представляет дополнительный аргумент.

function c = f(~)
    arguments
        ~
    end

    % Function code
end

Можно вызвать эту функцию без аргументов.

c = f 

Или с одним входным параметром.

c = f(2)

В следующей функции, символ тильды (~) представляет обязательный аргумент.

function c = f(~,x)
    arguments
        ~
        X
    end

    % Function code
    ...
end

Вызовы этой функции должны включать оба аргумента.

c = f(2,3)

Для получения дополнительной информации о вызывании функций с проигнорированными входными параметрами см. Игнорирование входных параметров функции.

Повторение аргументов

Повторяющиеся аргументы являются позиционными параметрами, которые могут неоднократно задаваться как входные параметры. Объявите повторяющиеся аргументы в arguments блокируйтесь, который включает Repeating атрибут.

arguments (Repeating)
    arg1
    arg2
    ...
end

Функции могут иметь только один Repeating arguments блокируйтесь, который может содержать один или несколько повторяющихся аргументов.

Функция, которая задает Repeating arguments блок может быть вызван нулем или большим количеством случаев всех аргументов в блоке. Если вызов функции включает повторяющиеся аргументы, то все аргументы в блоке должны быть включены для каждого повторения.

Повторение аргументов не может задать значения по умолчанию, чтобы привести дополнительный аргумент. Однако можно вызвать функцию без включения повторяющихся аргументов.

Функции должны объявить повторяющиеся аргументы после позиционных параметров и перед аргументами значения имени. Вы не можете задать аргументы значения имени в Repeating блок. Для получения информации об аргументах значения имени смотрите Аргументы Значения Имени.

В функции каждый аргумент повторения становится массивом ячеек, содержащим то же число элементов, как количество повторений передало в вызове функции. Валидация применяется к каждому элементу массива ячеек. Если функция вызвана с нулевыми случаями этого аргумента, массив ячеек имеет размер 1 на 0. Таким образом, это пусто.

Например, эта функция объявляет блок трех повторяющихся аргументов, xY, и options.

function [xCell,yCell,optionCell] = fRepeat(x,y,option)
    arguments (Repeating)
        x double
        y double
        option {mustBeMember(option,["linear","cubic"])}
    end
    
    % Function code
    % Return cell arrays
    xCell = x;
    yCell = y;
    optionCell = option;
end

Можно вызвать функцию без входных параметров или множителей трех входных параметров. MATLAB создает массив ячеек для каждого аргумента, содержащего все передачи значений для того аргумента. Этот вызов fRepeat передачи два набора трех повторяющихся аргументов.

[xCell,yCell,optionCell] = fRepeat(1,2,"linear",3,4,"cubic")
xCell =

  1×2 cell array

    {[1]}    {[3]}


yCell =

  1×2 cell array

    {[2]}    {[4]}


optionCell =

  1×2 cell array

    {["linear"]}    {["cubic"]}

Следующая функция принимает повторяющиеся аргументы для x и y входные параметры в Repeating arguments блок. В теле функции значения задали, когда повторяющиеся аргументы доступны в массивах ячеек x и y. Этот пример чередует значения x и y совпадать с необходимым входом к plot функция: plot(x1,y1,…).

function myPlotRepeating(x,y)
    arguments(Repeating)
        x (1,:) double
        y (1,:) double
    end

    % Function code
    % Interleave x and y
    z = reshape([x;y],1,[]);

    % Call plot function
    if ~isempty(z)
        plot(z{:});
    end
end

Вызовите эту функцию с повторяющимися парами входных параметров.

x1 = 1:10;
y1 = sin(x1);
x2 = 0:5;
y2 = sin(x2);
myPlotRepeating(x1,y1,x2,y2)

Избегайте использования varargin для повторения аргументов

Используя varargin с функциями, которые используют валидацию аргумента, не рекомендуется. Если вы используете varargin чтобы поддержать унаследованный код, это должен быть единственный аргумент в Repeating arguments блок.

Если varargin ограничивается в размере или классе в повторяющемся блоке аргументов, затем ограничения применяются ко всем значениям в varargin.

Например, эта функция задает два необходимых позиционных параметра и varargin в качестве повторяющегося аргумента.

function f(a, b, varargin)
    arguments
        a uint32
        b uint32
    end
    arguments (Repeating)
        varargin
    end
    
    % Function code
    ...
end

Аргументы значения имени

Аргументы значения имени сопоставляют имя со значением, которое передается функции. Аргументы значения имени:

  • Может быть передан функции в любом порядке

  • Являются всегда дополнительными

  • Должен быть объявлен после всех позиционных и повторяющихся аргументов

  • Не может появиться в arguments блокируйтесь, который использует Repeating атрибут

  • Должен использовать уникальные имена даже когда с помощью нескольких структур значения имени

  • Не может использовать имена, которые также используются в позиционных параметрах

Объявите аргументы значения имени в arguments блокируйте запись через точку использования, чтобы задать поля структуры. Например, структура под названием NameValueArgs задает два аргумента значения имени, Name1 и Name2. Можно использовать любой допустимый идентификатор MATLAB в качестве имени структуры.

arguments
    NameValueArgs.Name1
    NameValueArgs.Name2
end

Имя структуры должно появиться в функциональной подписи.

function myFunction(NameValueArgs)

Вызовите функцию с помощью имен полей в структуре значения имени, переданной как строка или вектор символов.

myFunction('Name1',value1,'Name2',value2)

Имя структуры, используемой в функциональной подписи, является именем структуры в функциональной рабочей области, которая содержит имена, и значения передали функции.

function result = myFunction(NameValueArgs)
    arguments
        NameValueArgs.Name1
        NameValueArgs.Name2
    end

    % Function code
    result = NameValueArgs.Name1 * NameValueArgs.Name2;
end
r = myFunction('Name1',3,'Name2',7)
r =

    21

Значения по умолчанию для аргументов значения имени

Можно задать значение по умолчанию для каждого имени. Если вы не задаете значение по умолчанию, и функция вызвана без того аргумента значения имени, то то поле не присутствует в структуре значения имени. Если никакие аргументы значения имени не передаются функции, MATLAB создает структуру, но это не имеет никаких полей.

Чтобы определить, какие аргументы значения имени были переданы в вызове функции, используйте isfield функция.

Например, следующая функция задает два необходимых позиционных параметра (width и height) и два аргумента значения имени (LineStyle и LineWidth). В этом примере, options структура имеет два поля (LineStyle и LineWidth) содержа или значения по умолчанию или значения, заданные в качестве аргументов значения имени, когда функция вызвана.

function myRectangle(width,height,options)
    arguments
        width double
        height double
        options.LineStyle (1,1) string = "-"
        options.LineWidth (1,1) {mustBeNumeric} = 1
    end

    % Function code
    ...
end

Все следующее является допустимыми способами вызвать эту функцию.

myRectangle(4,5)
myRectangle(4,5,"LineStyle",":","LineWidth",2)
myRectangle(4,5,"LineWidth",2,"LineStyle",":")
myRectangle(4,5,"LineStyle",":")
myRectangle(4,5,"LineWidth",2)

Используя аргументы повторения и значения имени

Если функция задает повторяющиеся аргументы, то необходимо объявить аргументы значения имени в отдельном arguments блокируйтесь, который следует за повторяющимся блоком аргументов. Например, эта функция принимает два повторяющихся аргумента, x и y. После определения всех повторений x и y, можно задать пару "имя-значение", которая присваивает значение lin или log к PlotType имя.

Определить, включает ли вызов функции PlotType аргумент, используйте isfield функционируйте, чтобы проверять на PlotType поле в scale структура.

function linLog(x,y,scale)
    arguments(Repeating)
        x (1,:) double
        y (1,:) double
    end
    arguments
        scale.PlotType (1,1) string
    end
    z = reshape([x;y],1,[]);
    if isfield(scale,"PlotType")
        if scale.PlotType == "lin"
            plot(z{:})
        elseif scale.PlotType =="log"
            loglog(z{:})
        end
    end
end

Вызовите эту функцию с или без аргумента значения имени.

myLinLog(1:5,1:5)
myLinLog(1:5,1:5,1:10,1:100:1000)
myLinLog(1:5,1:5,1:10,1:100:1000,"PlotType","log")

Несколько структур значения имени

Блоки аргумента функции могут содержать несколько структур значения имени. Однако имена полей должны быть уникальными среди всех структур. Эта функция имеет две структуры значения имени: lineOptions и fillOptions. Эти структуры не могут иметь тех же имен полей.

Аргументы в myRectangle функция объявляется можно следующим образом.

  • width и height требуемые позиционные параметры, типа double.

  • lineOptions.LineStyle скалярная строка со значением по умолчанию "-".

  • lineOptions.LineWidth скаляр, числовой со значением по умолчанию 1.

  • fillOptions.Color строка.

  • fillOptions.Pattern не имеет никаких ограничений на его значение.

function myRectangle(width,height,lineOptions,fillOptions)
    arguments
        width double
        height double
        lineOptions.LineStyle (1,1) string = "-"
        lineOptions.LineWidth (1,1) {mustBeNumeric} = 1
        fillOptions.Color string
        fillOptions.Pattern
    end

    % Function Code
    ...
end

Аргументы значения имени из свойств класса

Полезный синтаксис функций в MATLAB использует публичные свойства класса для имен аргументов значения имени. Задавать аргументы значения имени для всех устанавливаемых свойств, заданных классом (то есть, всех свойств с общедоступным SetAccess), используйте следующий синтаксис в arguments блок.

structName.?ClassName

Функция может использовать "structName.? ClassName"синтаксис только однажды. Поэтому функция может задать только одну структуру значения имени, которая получает ее имена полей от класса, даже если использование различных классов и структуры называет.

Если класс устанавливает ограничения для значений, которые можно присвоить свойству при помощи валидации свойства, то функция применяет валидацию к отдельным аргументам значения имени. Для получения информации о валидации свойства см. Проверку значений свойств.

Например, эта функция имеет два обязательных аргумента, x и y и принимает любое имя общественной собственности и значение для matlab.graphics.chart.primitive.Bar класс.

function myBar(x,y,propArgs)
    arguments
        x (:,:) double
        y (:,:) double
        propArgs.?matlab.graphics.chart.primitive.Bar
    end
    propertyCell = namedargs2cell(propArgs);
    bar(x,y,propertyCell{:})
end

Вызовите функцию с необходимыми входными параметрами и любыми устанавливаемыми парами "имя-значение" свойства.

x = [1,2,3;4,5,6];
y = x.^2;
myBar(x,y)
myBar(x,y,'FaceColor','magenta','BarLayout','grouped')

Замените определенные свойства

Можно заменить валидацию свойства класса путем переопределения имени свойства с аргументом значения собственного имени в блоке аргументов.

structName.?ClassName
structName.PropertyName (dim1,dim2,...) ClassName {fcn1,fcn2,...}

Валидация аргумента значения собственного имени заменяет валидацию, заданную классом для индивидуально заданного имени свойства.

Например, следующая функция задает аргументы значения имени как свойства matlab.graphics.chart.primitive.Bar класс. Кроме того, это заменяет имя свойства FaceColor позволить только эти определенные значения: 'red', или 'blue'.

matlab.graphics.chart.primitive.Bar класс имеет значение по умолчанию для FaceColor это не одно из ограниченных значений ('red', или 'blue'). Поэтому переопределяющее объявление должно присвоить значение по умолчанию, которое удовлетворяет ограничению, установленному mustBeMember функция валидации. Таким образом, значением по умолчанию должен быть 'red', или 'blue'.

Эта функция преобразует структуру значения имени в массив ячеек, содержащий чередованные имена и значения с помощью namedargs2cell функция.

function myBar(x,y,propArgs)
    arguments
        x (:,:) double
        y (:,:) double
        propArgs.?matlab.graphics.chart.primitive.Bar
        propArgs.FaceColor {mustBeMember(propArgs.FaceColor,{'red','blue'})} = "blue"
    end
    propertyCell = namedargs2cell(propArgs);
    bar(x,y,propertyCell{:})
end

Вызовите функцию с помощью этих двух обязательных аргументов, x и y. Опционально передайте любые пары "имя-значение", поддержанные функцией панели и значением для FaceColor это может быть любой red или blue. Другие значения для FaceColor не позволены.

x = [1,2,3;4,5,6];
y = x.^2;
myBar(x,y)
myBar(x,y,'FaceColor','red','BarLayout','grouped')

Валидация аргумента в методах класса

Проверка входных параметров метода полезна в открытых методах, потому что вызовы метода не могут произойти в коде класса. Можно использовать валидацию аргумента функции в методах реального класса. Однако абстрактные методы не могут задать arguments блоки. Для получения информации о методах класса см. Методы.

Если classdef файл включает прототипы метода для методов, заданных в отдельных файлах, включайте блоки аргументов в отдельные файлы, задающие метод.

Методы подклассов не наследовали валидацию аргумента функции. Методы подклассов, которые заменяют методы суперкласса, должны использовать ту же валидацию аргумента функции в методе подклассов как хорошая практика.

Методы деструктора класса Handle не могут использовать валидацию аргумента. Метод под названием delete в подклассе указателя, который включает arguments блок не обработан как деструктор (не вызванный MATLAB, когда объект уничтожается). Для получения дополнительной информации о методах деструктора класса смотрите Деструктор Класса Handle.

Порядок валидации аргумента

Когда функция вызвана, MATLAB подтверждает входные параметры в порядке, которым они объявляются в arguments блокируйтесь, сверху донизу. Каждый аргумент полностью подтвержден, прежде чем следующий аргумент подтвержден. Поэтому любая ссылка на ранее заявленный аргумент использует значения, которые были подтверждены. Функции выдают ошибку в результате первого отказа валидации.

Подтвержденные значения могут отличаться от исходных значений, переданных как входные параметры, когда функция вызвана. Например, эта функция объявляет входные параметры как класс uint32 значения. Третье входное объявление присваивает значение по умолчанию, равное продукту первых двух входных параметров.

function c = f(a, b,c)
    arguments
        a uint32
        b uint32
        c uint32 = a .* b
    end

    % Function code
    ...
end

Вызывая функцию с входными параметрами, которые являются различным числовым классом (например, double) результаты в преобразовании в uint32.

c = f(1.8,1.5)

Поскольку дополнительный входной параметр c не задан в вызове функции, MATLAB оценивает значение по умолчанию и присваивает его c после преобразования a и b к uint32 значения. В этом случае преобразование приводит к значению 2 для обоих входных параметров. Поэтому продукт a времена b четыре.

c =

  uint32

   4

Если вы задаете значение для третьего входа, то функция присваивает значение c и не выполняет выражение значения по умолчанию.

c = f(1.8,1.5,25)
c =

  uint32

   25

Предотвращение преобразований класса и размера

Во время процесса валидации MATLAB применяет класс и затем валидацию размера прежде, чем вызвать любые функции валидации. Если значение по умолчанию используется в дополнительном входе, который не использован в вызове функции, это значение присвоено аргументу прежде, чем применить процесс валидации.

Когда значение аргумента, которое передается функции, не совпадает с классом и размером, требуемым валидацией, MATLAB преобразует значение в заявленный класс и размер, когда преобразование возможно. Однако могут быть ситуации, где преобразование не является желаемым поведением. Например, char или string может быть преобразован в двойное, скалярное расширение, может изменить размер, чтобы удовлетворить ограничениям размера, или вектор-столбец может быть преобразован в вектор-строку.

Чтобы устранить стандартные преобразования, выполняемые MATLAB от валидации входного параметра, используйте функции валидации вместо ограничений размера и класса. Вызовы функций валидации не делают возвращаемых значений и не могут изменить значение входного параметра.

Например, эта функция ограничивает первый вход двумерным массивом любого размера, который имеет класс дважды. Второй вход должен быть 5 3 массив любого класса.

function f(a, b)
    arguments
        a (:,:) double
        b (5,3)
    end

    % Function code
    ...
end

Из-за стандартного преобразования типов MATLAB и скалярного расширения, можно вызвать эту функцию со следующими входными параметрами и не получить ошибки валидации. По умолчанию MATLAB преобразует элементы вектора символов к их эквивалентному числовому значению и применяет скалярное расширение, чтобы создать 5 3 массив от скалярного значения 144.

f('character vector',144)

Используя специализированную валидацию функции могут обеспечить более определенную валидацию входного параметра. Например, эта функция задает две специализированных функции валидации, которые она использует вместо класса и спецификаций размера для первых и вторых аргументов. Эти локальные функции позволяют вам избежать преобразований входного значения.

function fCustomValidators(a, b)
    arguments
        a {mustBeA(a,'double'), mustBeDims(a,2)}
        b {mustBeSize(b,[5,3])}
    end

    % Function code
    ...
end

% Custom validator functions
function mustBeA(input,className)
    % Test for specific class
    if ~isa(input,className)
        error('Input must be of class double.')
    end
end

function mustBeSize(input,sizeDims)
    % Test for specific size
    if ~isequal(size(input),sizeDims)
        error(['Input must be of size ',num2str(sizeDims)])
    end
end

function mustBeDims(input,numDims)
    % Test for number of dimensions
    if ~isequal(length(size(input)),numDims)
        error(['Input must have ',num2str(numDims),' dimensions.'])
    end
end

mustBeSize и mustBeDims функции валидации осуществляют строгие объявления для входных параметров.

fCustomValidators('character vector',144)
Invalid input argument at position 1. Input must be of class double

В этом вызове количество размерностей первого входа является неправильным, и функция валидации возвращает пользовательское сообщение об ошибке.

fCustomValidators(ones(2,2,4),144)
Invalid input argument at position 1. Input must have 2 dimensions

mustBeSize функция блока проверки допустимости ограничивает второй вход определенной размерностью, которая обеспечивается в сообщении об ошибке.

fCustomValidators(ones(2,2),144)
Invalid input argument at position 2. Input must be of size [5  3]

nargin в валидации аргумента

nargin функция возвращает количество входных аргументов функции, данных в вызове функции выполняющегося в данного момента. При использовании валидации аргумента функции, значение, возвращенное nargin в функции количество позиционных параметров, обеспеченных, когда функция вызвана. Это значение не включает дополнительные аргументы, которые не включены в вызов функции. Кроме того, nargin не считает аргументов значения имени.

Повторяющиеся аргументы являются позиционными параметрами, и поэтому количество повторяющихся аргументов передало функции, когда названо включен в значение, возвращенное nargin.

Используйте nargin определить, передаются ли дополнительные позиционные параметры функции, когда названо. Например, эта функция объявляет три позиционных параметра и аргумент значения имени. Вот то, как функция определяет, какие аргументы передаются, когда она называется.

  • nargin определяет если дополнительный позиционный параметр c передается функции с switch блок.

  • isfield определяет если аргумент значения имени для Format передается функции.

function result = fNargin(a, b, c, namedargs)
    arguments
        a (1,1) double
        b (1,1) double
        c (1,1) double = 1
        namedargs.Format (1,:) char
    end

    % Function code
    switch nargin
        case  2
            result = a + b;
        case 3
            result = a^c + b^c;
    end
    if isfield(namedargs,'Format')
        format(namedargs.Format);
    end
end

В этом вызове функции:

result = fNargin(3,4)
result =

     7

Значение возвращено nargin в функции 2.

В этом вызове функции:

result = fNargin(3,4,7.62)
result =

   4.3021e+04

Значение возвращено nargin в функции 3.

В этом вызове функции:

result = fNargin(3,4,7.62,'Format','bank')
result =

      43020.56

Значение возвращено nargin в функции 3.

Ограничения на переменный и функциональный доступ

Блоки аргументов существуют в рабочей области функции. Если функция использует import команда, чтобы добавить пакеты, классы или функции к осциллографу функции, затем тот же осциллограф применяется в arguments блок.

Единственные переменные, видимые к функциям блока проверки допустимости и выражениям значения по умолчанию, являются входными переменными, уже объявленными. В этой функции, значении по умолчанию c выведен из a и b.

function c = f(a,b,c)
    arguments
        a uint32
        b uint32
        c uint32 = a * b
    end
 
    % Function code
    ...
end

Однако вы не можете обратиться к входным переменным, еще не объявленным в arguments блок. Например, с помощью этого объявления в аргументе a в предыдущей функции не допустимо потому что b и c еще не были объявлены.

arguments
    a uint32 = b * c
    b uint32
    c uint32
end

Выражения валидации аргумента могут сослаться только ранее объявленный, и поэтому подтвержденный, аргументы.

Функции валидации и значения по умолчанию для аргументов значения имени не могут получить доступ к другим аргументам значения имени.

Ограничения на функции в arguments Блок

Любые ссылки на ранее заявленные аргументы должны отобразиться в тексте функций валидации и значений по умолчанию. Чтобы гарантировать прозрачность по коду, не используйте функции, которые взаимодействуют с функциональной рабочей областью. А именно, не используйте вложенные функции или любую из функций, перечисленных в следующей таблице в arguments блок.

assigninbuiltinclear
dbstackevalevalc
evalinexistfeval
inputinputnameload
narginnarginchknargoutchk
savewhoswho

Эти ограничения применяются только в arguments блокируйтесь и не обращайтесь к переменным или функциям в теле функции.

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте