Чтобы настроить предложения и дополнения кода для ваших функций, предоставьте MATLAB ® информацию о сигнатурах ваших функций. Сигнатуры функций описывают допустимые синтаксисы и допустимые типы данных для функции. MATLAB использует эту информацию для улучшения интерактивных функций, таких как заполнение вкладок и подсказки функций. Определите эту информацию о функции в файле в формате JSON с именемfunctionSignatures.json.
Чтобы MATLAB обнаружил информацию о сигнатуре функции, необходимо разместить functionSignatures.json в папке, содержащей код функции. При определении информации для метода класса или функции пакета необходимо разместить functionSignatures.json в родительской папке самого внешнего класса или папки пакета. Например, чтобы определить информацию для метода myClass, место functionSignatures.json в папке myFolder для этих структур классов и пакетов:
myFolder/+myPackage/@myClass myFolder/+myPackage/+mySubpackage/@myClass
В одном файле можно определить сигнатуры для нескольких функций.
functionSignatures.json содержит один объект JSON. JSON использует скобки для определения объектов и ссылается на объекты как коллекции пар имен и значений. Поскольку эти термины перегружены в контексте сигнатур функций, вместо «name» используется «property». Объект JSON в functionSignatures.json содержит дополнительную версию схемы и список объектов функции. Каждый объект функции содержит список объектов сигнатуры, а каждый объект сигнатуры содержит массив объектов аргументов. JSON использует скобки для определения массивов.

Чтобы указать дополнительную версию схемы, используйте _schemaVersion в качестве первого свойства и номер версии в качестве его значения. Укажите номер версии как строку JSON в формате , с каждым числом, указанным как неотрицательное целое число. Текущая версия схемы: major#.minor#.patch#1.0.0. Если в файле не указана версия схемы, MATLAB предполагает версию 1.0.0.
Если functionSignatures.json содержит синтаксические ошибки, MATLAB отображает сообщение об ошибке в окне команд при чтении файла. Используйте validateFunctionSignaturesJSON для проверки functionSignatures.json для схемы JSON и схемы подписи функции MATLAB.
Чтобы определить информацию для функции, создайте свойство, совпадающее с именем функции. Его значение является объектом подписи.
{
"functionName1": { signatureObj1 },
"functionName2": { signatureObj2 }
}Чтобы определить информацию для метода класса или функции пакета, используйте полное имя функции или метода. Например, определите метод класса myMethod и функция пакета myFunction.
{
"myClass.myMethod": { signatureObj },
"myPackage.myFunction": { signatureObj }
}Можно определить несколько сигнатур функций для одной функции или метода, определив несколько объектов функций с одним и тем же свойством (имя функции или метода). Дополнительные сведения см. в разделе Несколько подписей.
Объект сигнатуры определяет входные и выходные аргументы и поддерживаемые платформы для функции. Значение каждого свойства, за исключением platforms - массив объектов-аргументов.
{
"functionName1":
{
"inputs": [ argumentObj1, argumentObj2 ]
}
}Если указан метод экземпляра, например myClass.myMethod в файле JSON - один из элементов в inputs должен быть объектом myClass. Обычно этот объект является первым элементом. MATLAB поддерживает предложения и дополнения кода для указанного метода при вызове его с помощью точечной нотации (b = myObj.myMethod(a)или нотация функции (b = myMethod(myObj,a)) синтаксис.
Каждая сигнатура в файле JSON может содержать следующие свойства.
| Собственность | Описание | Тип значения данных JSON |
|---|---|---|
inputs | Список аргументов ввода функции. MATLAB использует это свойство для предложений и дополнений кода. | Массив объектов-аргументов |
outputs | Список аргументов вывода функции. MATLAB использует это свойство для уточнения предложений и дополнений кода. | Массив объектов-аргументов |
platforms | Список платформ, поддерживающих функцию. MATLAB не предоставляет предложений и дополнений пользовательского кода, если платформа не поддерживает функцию. По умолчанию используются все платформы. Элементы списка должны соответствовать | Строка значений, разделенных запятыми |
Объекты Argument определяют информацию для каждого из входных и выходных аргументов.
{
"functionName1":
{
"inputs":
[
{"name":"in1", "kind":"required", "type":["numeric"]},
{"name":"in2", "kind":"required", "type":["numeric","integer","scalar"]}
]
}
}Порядок отображения входных данных в файле JSON является значительным. Например, в вызове functionName1 функция, in1 должен появиться до in2.
Каждый объект аргумента может содержать следующие свойства.
type - Класс и/или атрибуты аргумента
repeating - Указать аргумент несколько раз
Для более сложных сигнатур функций для каждого объекта аргумента доступны следующие свойства.
platforms - Список поддерживаемых платформ
tuple - Определение набора аргументов
mutuallyExclusiveGroup - Определение набора исключительных аргументов
В этом примере описывается создание пользовательских предложений кода и дополнений для функции.
Создайте функцию, подпись которой будет описана в JSON-файле на последующих шагах. Следующая функция принимает:
Два обязательных аргумента
Один необязательный позиционный аргумент через varargin
Два необязательных аргумента пары имя-значение через varargin
myFunc представлен для демонстрации предложений кода и не включает проверку аргументов.
% myFunc Example function % This function is called with any of these syntaxes: % % myFunc(in1, in2) accepts 2 required arguments. % myFunc(in1, in2, in3) also accepts an optional 3rd argument. % myFunc(___, NAME, VALUE) accepts one or more of the following name-value pair % arguments. This syntax can be used in any of the previous syntaxes. % * 'NAME1' with logical value % * 'NAME2' with 'Default', 'Choice1', or 'Choice2' function myFunc(reqA,reqB,varargin) % Initialize default values NV1 = true; NV2 = 'Default'; posA = []; if nargin > 3 if rem(nargin,2) posA = varargin{1}; V = varargin(2:end); else V = varargin; end for n = 1:2:size(V,2) switch V{n} case 'Name1' NV1 = V{n+1}; case 'Name2' NV2 = V{n+1} otherwise error('Error.') end end end end
В той же папке, что и myFunc, создайте следующее описание сигнатуры функции в файле с именем functionSignatures.json. Входные имена не совпадают с именами в теле myFunc, но согласуются с текстом справки.
{
"_schemaVersion": "1.0.0",
"myFunc":
{
"inputs":
[
{"name":"in1", "kind":"required", "type":["numeric"], "purpose":"ID of item"},
{"name":"in2", "kind":"required", "type":["numeric"], "purpose":"# Items"},
{"name":"in3", "kind":"ordered", "type":["numeric"], "purpose":"Input Value"},
{"name":"Name1", "kind":"namevalue", "type":["logical","scalar"],"purpose":"Option"},
{"name":"Name2", "kind":"namevalue", "type":["char", "choices={'Default','Choice1','Choice2'}"]}
]
}
}
MATLAB использует это описание сигнатуры функции для информирования о предложениях и завершении кода.
MATLAB использует информацию о сигнатуре функции в файле JSON для отображения соответствующих синтаксисов при вводе (подсказки функций). Частично введенный текст можно заполнить, нажав клавишу Tab (заполнение вкладки). В окне команд или редакторе MATLAB не использует файл JSON для отображения подсказок функций. Поведение подсказок функций и завершения табуляции суммировано в таблице.
| Инструмент | Подсказки функций | Завершение закладки |
|---|---|---|
| Редактор в реальном времени | Да | Да |
| Редактор | Нет | Да |
| Окно команд | Нет | Да |
В MATLAB Online™ редактор ведет себя так же, как и Live Editor.
Чтобы поэкспериментировать с предложениями кода в Live Editor, вызовите myFunc из живого сценария. Появятся имена и цели из файла JSON. MATLAB указывает, когда аргументы являются необязательными и есть ли несколько предложений (например, третий позиционный аргумент или пара имя-значение). Перечислены опции пар «имя-значение».

При добавлении аргумента пары имя-значение к вызову функции MATLAB представляет варианты из файла JSON. С тех пор 'Name1' определяется как логический скаляр, MATLAB заполняет варианты автоматически (true или false). MATLAB принимает три значения для 'Name2' из файла JSON.

Если функция имеет много синтаксисов, может быть полезно для предложений кода группировать синтаксисы как несколько сигнатур функций (независимо от реализации функции). Чтобы предоставить предложения кода и дополнения для нескольких сигнатур, создайте несколько объектов функций с одним и тем же свойством в файле JSON.
Рассмотрим следующую функцию, которая следует различным кодовым путям в зависимости от класса второго входа. Эта функция представлена в качестве примера для предложений кода и, следовательно, не выполняет никаких вычислений или проверки ошибок.
function anotherFunc(arg1,arg2,arg3) switch class(arg2) case 'double' % Follow code path 1 case {'char','string'} % Follow code path 2 otherwise error('Invalid syntax.') end end
С точки зрения предложений кода, рассматривайте функцию как имеющую две сигнатуры функции. Первая подпись принимает два требуемых числовых значения. Вторая сигнатура принимает требуемое числовое значение, а затем символ или строку и, наконец, требуемое числовое значение. Чтобы определить несколько сигнатур функций, определите несколько объектов функций в файле JSON с одним и тем же свойством (именем функции).
{
"_schemaVersion": "1.0.0",
"anotherFunc":
{
"inputs":
[
{"name":"input1", "kind":"required", "type":["numeric"]},
{"name":"input2", "kind":"required", "type":["numeric"]}
]
},
"anotherFunc":
{
"inputs":
[
{"name":"input1", "kind":"required", "type":["numeric"]},
{"name":"input2", "kind":"required", "type":[["char"],["string"]]},
{"name":"input3", "kind":"required", "type":["numeric"]}
]
}
}Кроме того, можно определить несколько сигнатур функций с помощью mutuallyExclusiveGroup свойства объекта аргумента. Как правило, реализовать несколько объектов функций проще и удобнее, но использование взаимоисключающих групп позволяет повторно использовать объекты общих аргументов, такие как input1.
{
"_schemaVersion": "1.0.0",
"anotherFunc":
{
"inputs":
[
{"name":"input1", "kind":"required", "type":["numeric"]},
{"mutuallyExclusiveGroup":
[
[
{"name":"input2", "kind":"required", "type":["numeric"]}
],
[
{"name":"input2", "kind":"required", "type":[["char"],["string"]]},
{"name":"input3", "kind":"required", "type":["numeric"]}
]
]
}
]
}
}validateFunctionSignaturesJSON