Валидация аргумента функции является способом объявления определенных ограничений на входные аргументы функции. Используя валидацию аргументов, можно ограничить класс, размер и другие аспекты входного параметра функции значений без написания кода в тело функции для выполнения этих тестов.
Валидация аргумента функции декларативна, что включает MATLAB® инструменты рабочего стола для извлечения информации о функции путем проверки определенных блоков кода. Объявив требования к входным параметрам, можно устранить громоздкий код проверки аргументов и улучшить читаемость, робастность и поддерживаемость вашего кода.
Синтаксис валидации аргумента функции упрощает процесс определения необязательных, повторяющихся и аргументов имя-значение. Синтаксис также позволяет вам задавать значения по умолчанию последовательным образом.
Использование валидации аргумента функции необязательно в определениях функций. Валидация аргументов наиболее полезна в функциях, которые могут быть вызваны любым кодом и где валидность входов должна быть определена перед выполнением кода функции. Функции, которые предназначены для использования другими, могут воспользоваться соответствующим уровнем ограничения входных входов аргумента и возможностью возврата определенных сообщений об ошибке на основе входов в функции.
В локальных и частных функциях, а также в частных или защищенных методах вызывающий абонент осведомлен о входе требованиях, поэтому эти типы функций могут вызываться с допустимыми аргументами.
Вы не можете использовать синтаксис валидации аргументов во вложенных функциях, абстрактных методах или классе Handle методах деструктора. Дополнительные сведения о проверке аргументов в методах см. в разделе Валидация аргументов в методах классов.
arguments
Синтаксис блоковФункции определяют валидацию аргументов в кодовых блоках, которые разграничены ключевыми словами 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, которые не используют classdef
ключевое слово (классы, заданные перед программным обеспечением MATLAB версии 7.6).
Вот несколько примеров:
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 на любую длину с двойной точностью.
C
- массив ячеек 2 на 2.
Следующая функция иллюстрирует, как входы могут быть преобразованы, чтобы соответствовать классам, заданным в arguments
блок. The 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
Функции валидации могут ограничивать входные параметры более конкретными способами. Можно использовать предопределенные функции валидации для многих распространенных видов валидации, и можно задать собственную функцию валидации, чтобы удовлетворить определенным требованиям.
Для примера эта функция задает следующие валидации, используя mustBeNumeric
, mustBeReal
, mustBeMember
и локальную функцию 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 for equal size if ~isequal(size(a),size(b)) eid = 'Size:notEqual'; msg = 'Size of first input must equal size of second input.'; throwAsCaller(MException(eid,msg)) end end
Избегайте использования проверки аргументов функции в пользовательских функциях валидации. Для получения дополнительной информации об определении функций валидации и списка предопределенных функций валидации, смотрите Функции валидации аргументов.
Валидация аргумента функции может объявить четыре типа аргументов. Функции могут определять любой из этих видов аргументов, но аргументы должны быть определены в следующем порядке:
Необходимые позиционные аргументы
Необязательные позиционные аргументы
Повторяющиеся позиционные аргументы
Необязательные аргументы имя-значение
Позиционные аргументы должны быть переданы функции в определенном порядке. Положение значения, переданного в списке аргументов, должно соответствовать порядку, в котором аргумент объявлен в arguments
блок. Все имена аргумента в arguments
блок должен быть уникальным.
Позиционные аргументы в arguments
блок требуется при вызове функции, если только аргумент не задает значение по умолчанию. Установка значения по умолчанию в объявлении аргумента делает позиционный аргумент необязательным, поскольку MATLAB может использовать значение по умолчанию, когда в вызове функции не передается значение.
Значение по умолчанию может быть константой или выражением, которое создает результат, удовлетворяющий объявлению аргумента. Выражение может ссылаться на аргументы, объявленные перед ним в arguments
блокируйте, но не аргументы, объявленные после него.
MATLAB оценивает выражение значения по умолчанию только, когда аргумент не включен в вызов функции.
Все необязательные аргументы должны быть расположены после всех необходимых аргументов в arguments
блок. Для примера в этом аргументе блоке maxval
и minval
имеют значения по умолчанию и поэтому являются необязательными.
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)
Необязательный позиционный аргумент становится необходимым, когда его положение должно быть заполнено в вызове функции, чтобы идентифицировать аргументы, которые приходят после него. То есть, если вы хотите задать значение для minval
необходимо задать значение для maxval
.
MATLAB позволяет игнорировать входные параметры путем передачи символа tilde (~
) вместо аргумента. Можно задать функцию, которая игнорирует неиспользованные позиционные аргументы путем добавления символа tilde (~
) в блоке аргументов, соответствующем положению аргумента в сигнатуре функции. Добавьте символ тильды (~
) для каждого проигнорированного аргумента в сигнатуре функции.
Проигнорированные аргументы не могут иметь значений по умолчанию или задавать класс, размер или функции валидации.
Символ тильды (~
) рассматривается как необязательный входной параметр, если за ним не следует необходимый позиционный аргумент. Для примера в этой функции символ тильды (~
) представляет необязательный аргумент.
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
arguments
для каждого повторения должен быть включен блок.
Для примера, если a Repeating
arguments
блок задает аргументы x
и y
, затем каждый повтор должен содержать оба x
и y
.
Повторяющиеся аргументы не могут задавать значения по умолчанию и поэтому не могут быть необязательными. Однако можно вызвать функцию, не включая никаких повторяющихся аргументов.
Функции должны объявлять повторяющиеся аргументы после позиционных аргументов и перед аргументами имя-значение. Вы не можете задать аргументы имя-значение в Repeating
блок. Для получения информации об аргументах имя-значение смотрите Аргументы имя-значение.
В функции каждый повторяющийся аргумент становится массивом ячеек с количеством элементов, равным количеству повторений, переданных в вызове функции. Валидация применяется к каждому элементу массива ячеек. Если функция вызывается с нулем вхождений этого аргумента, массив ячеек имеет размер 1 на 0. То есть он пуст.
Для примера эта функция объявляет блок из трех повторяющихся аргументов, x
, y
, и option
.
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
ограничено в размере или классе в блоке повторяющихся аргументов, затем ограничения применяются ко всем значениям в varargin
.
Если вы используете varargin
для поддержки унаследованного кода он должен быть единственным аргументом в Repeating
arguments
блок.
Для примера эта функция задает два необходимых позиционных аргумента и 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)
Перед R2021a передайте имена как строки или векторы символов, а также разделите имена и значения запятыми. Оба синтаксиса действительны в более поздних релизах.
Имя структуры, используемой в сигнатуре функции, является именем структуры в рабочей области функции, которая содержит имена и значения, переданные функции.
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
Аргументы имя-значение поддерживают частичное совпадение имен, когда нет неоднозначности. Для примера - функция, которая задает LineWidth
и LineStyle
как его два аргумента в виде имя-значение принимают LineW
и LineS
, но использование Line
приводит к ошибке. В целом использование полных имен является рекомендуемой практикой, чтобы улучшить читаемость кода и избежать неожиданного поведения.
Для каждого имени можно задать значение по умолчанию. Если вы не задаете значение по умолчанию, и функция вызывается без этого аргумента имя-значение, то это поле не присутствует в структуре имя-значение. Если аргументы имя-значение не передаются функции, 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)
Перед R2021a передайте имена как строки или векторы символов, а также разделите имена и значения запятыми. Для примера:
myRectangle(4,5,"LineStyle",":","LineWidth",2) myRectangle(4,5,"LineWidth",2,"LineStyle",":")
Если функция задает повторяющиеся аргументы, необходимо объявить аргументы имя-значение в отдельном 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
Вызовите эту функцию с аргументом name-value или без него.
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")
Перед R2021a передайте имена как строки или векторы символов, а также разделите имена и значения запятыми. Для примера:
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")
Перед R2021a передайте имена как строки или векторы символов, а также разделите имена и значения запятыми. Для примера:
myBar(x,y,"FaceColor","magenta","BarLayout","grouped")
Можно переопределить валидацию свойства класса, переопределив имя свойства с помощью определенного аргумента имя-значение в блоке аргументов.
structName.?ClassName structName.PropertyName (dim1,dim2,...) ClassName {fcn1,fcn2,...}
Конкретный аргумент в валидацию «имя-значение» переопределяет валидацию, заданное классом для индивидуально заданного имени свойства.
Например, следующая функция определяет аргументы имя-значение как свойства matlab.graphics.chart.primitive.Bar
класс. Функция также переопределяет имя свойства FaceColor
чтобы разрешить только эти конкретные значения: red
или blue
.
The 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
. Опционально передайте любые пары "имя-значение", поддерживаемые функцией bar и значением для 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
блоки. Для получения информации о методах классов см. Методы и абстрактные классы и члены класса.
Если a classdef
файл включает прототипы методов, определенных в отдельных файлах, включая arguments
блоки в отдельных файлах, определяющих метод. Для получения дополнительной информации об определении методов в отдельных файлах, см. Методы в отдельных файлах.
Методы подкласса не наследуют валидацию аргумента функции. В подклассах, которые переопределяют методы суперкласса, можно добавить к подклассу ту же валидацию аргументов, что и в суперклассе.
Методы уничтожения классов Handle не могут использовать валидацию аргументов. Метод с именем delete
в подклассе указателя, который включает в себя arguments
блок не рассматривается как деструктор. (Другими словами, он не вызывается MATLAB, когда объект уничтожается). Для получения дополнительной информации о методах разрушения классов смотрите Класс Handle Destructor.
Когда вызывается функция, 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 преобразует значение в объявленные класс и размер, когда преобразование возможно. Однако преобразование может не быть желаемым поведением.
Вот некоторые примеры преобразований, которые MATLAB может выполнить.
Чтобы удовлетворить ограничению числового класса:
A char
значение может быть преобразовано в его Юникод® числовое значение.
A string
можно преобразовать в число или NaN
если строка не является представлением одного числа.
Чтобы удовлетворить ограничению размера:
Скалярное расширение может изменить размер от скалярного до нескалярного.
Можно преобразовать вектор-столбец в вектор-строку.
Чтобы исключить стандартные преобразования, выполненные MATLAB из проверки входных параметров, используйте функции валидации вместо ограничений классов и размеров. Вызовы функций валидации не возвращают значения и не могут изменить значение входного параметра.
Для примера эта функция ограничивает первый вход двумерным массивом любого размера, который является классом double
. Второй вход должен быть массивом 5 на 3 любого класса.
function f(a, b) arguments a (:,:) double b (5,3) end % Function code ... end
Из-за стандартного преобразования типов MATLAB и скалярного расширения можно вызвать эту функцию со следующими входами и не получить ошибку валидации.
f('character vector',144)
По умолчанию MATLAB преобразует элементы вектора символов в их эквивалентное числовое значение и применяет скалярное расширение, чтобы создать массив 5 на 3 из скалярного значения 144
.
Использование специализированных функций валидации может обеспечить более конкретную валидацию входных параметров. Для примера эта функция определяет специализированные функции валидации, которые она использует вместо спецификаций классов и размеров для первого и второго аргументов. Эти локальные функции позволяют вам избегать преобразований входных значений.
mustBeOfClass
ограничивает вход определенным классом, не допуская преобразования или подклассы. Для связанной функции см. mustBeA
.
mustBeEqualSize
ограничивает два входа равным размером, не допуская скалярного расширения. Для связанной функции см. mustBeScalarOrEmpty
.
mustBeDims
ограничивает вход, чтобы быть заданным измерением, не позволяя транспонировать или скалярное расширение. Для связанной функции см. mustBeVector
.
function fCustomValidators(a,b) arguments a {mustBeOfClass(a,'double'), mustBeDims(a,2)} b {mustBeEqualSize(b,a)} end % Function code ... end % Custom validator functions function mustBeOfClass(input,className) % Test for specific class name cname = class(input); if ~strcmp(cname,className) eid = 'Class:notCorrectClass'; msg = ['Input must be of class ', cname]; throwAsCaller(MException(eid,msg)) end end function mustBeEqualSize(a,b) % Test for equal size if ~isequal(size(a),size(b)) eid = 'Size:notEqual'; msg = 'Inputs must have equal size.'; throwAsCaller(MException(eid,msg)) end end function mustBeDims(input,numDims) % Test for number of dimensions if ~isequal(length(size(input)),numDims) eid = 'Size:wrongDimensions'; msg = ['Input must have dimensions: ',num2str(numDims)]; throwAsCaller(MException(eid,msg)) end end
mustBeOfClass
функция обеспечивает строгое соответствие классов, требуя соответствия с именем класса. Более общий подход мог бы использовать isa
функция, которая также соответствует подклассам заданного класса.
mustBeEqualSize
и 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
mustBeEqualSize
Функция validator ограничивает второй вход определенной размерностью, которое предусмотрено в сообщении об ошибке.
fCustomValidators(ones(2,2),144)
Invalid input argument at position 2. Input must be of size [5 3]
Для связанных предопределенных функций валидации см. mustBeA
, mustBeFloat
, и mustBeVector
.
nargin
в валидации аргументов nargin
функция возвращает количество входных аргументов функции, заданное в вызове, в текущую выполняемую функцию. При использовании валидации аргумента функции значение, возвращаемое nargin
внутри функции находится количество позиционных аргументов, предоставляемых при вызове функции.
Повторяющиеся аргументы являются позиционными аргументами, и поэтому количество повторяющихся аргументов, переданных функции при вызове, включается в значение, возвращаемое nargin
.
Значение, которое nargin
возвраты не содержит необязательных аргументов, которые не включены в вызов функции. Также, nargin
не подсчитывает аргументы имя-значение.
Использовать nargin
чтобы определить, передаются ли функции необязательные позиционные аргументы при вызове. Для примера эта функция объявляет три позиционных аргумента и аргумент имя-значение. Вот как функция определяет, какие аргументы передаются при вызове.
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
В этом вызове функции значение nargin
является 2
:
result = fNargin(3,4)
result = 7
В этом вызове функции значение nargin
является 3
:
result = fNargin(3,4,7.62)
result = 4.3021e+04
В этом вызове функции значение nargin
3:
result = fNargin(3,4,7.62,Format="bank")
result = 43020.56
arguments
блоки существуют в рабочей области функции. Любые пакеты, классы или функции, добавленные в возможности функции, используя 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
блок.
assignin | builtin | clear |
dbstack | eval | evalc |
evalin | exist | feval |
input | inputname | load |
nargin | narginchk | nargoutchk |
save | whos | who |
Эти ограничения применяются только в arguments
блокируйте и не применяйте к переменным или функциям в теле функции.
Во время отладки внутри аргументов блокируйте рабочую область только для чтения. Это означает, что можно просмотреть рабочую область и просмотреть значения, присвоенные переменным. Однако невозможно создать новые переменные или изменить значения, присвоенные существующим переменным, пока рабочая область доступна только для чтения. Когда отладчик окажется вне блока аргументов, снова можно будет создавать или редактировать переменные.