Настройте предложения кода и завершения

Чтобы настроить предложения кода и завершения для ваших функций, предоставьте MATLAB® информацию о ваших функциональных подписях. Функциональные подписи описывают приемлемые синтаксисы и допустимые типы данных для функции. MATLAB использует эту информацию, чтобы улучшить интерактивные функции, такие как заполнение клавишей Tab и подсказчик функций. Задайте эту функциональную информацию в JSON-отформатированном файле под названием functionSignatures.json.

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

Файл functionSignatures.json содержит единственный объект JSON. JSON использует фигурные скобки, чтобы задать объекты и называет объекты наборами пар значения и имени. Поскольку эти условия перегружаются в контексте функциональных подписей, "свойство" используется вместо "имени". Объект 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 }
}

Чтобы задать информацию для метода класса или функции пакета, используйте полное имя функции или метода. Свойствами в качестве примера является "MyClass.myMethod" или "myPackage.myFunction". Можно задать несколько функциональных подписей для той же функции путем определения нескольких функциональных объектов с тем же свойством (имя функции). Для получения дополнительной информации смотрите Несколько Подписей.

Объекты подписи

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

{
  "functionName1":
  {
     "inputs": [ argumentObj1, argumentObj2 ]
  }
}

Каждая подпись может включать следующие свойства.

СвойствоОписаниеТип данных JSON значения
inputs

Список аргументов входного параметра функции. MATLAB использует это свойство для предложений кода и завершений.

Массив объектов аргумента

выходные параметры

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

Массив объектов аргумента

platforms

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

Значением по умолчанию являются все платформы. Элементы списка должны совпадать с archstr, возвращенным в функцию computer. Список может быть содержащим или исключительным, но не оба. Значениями в качестве примера является "win64,maci64" или "-win64,-maci64".

Строка разделенных от запятой значений

Объекты аргумента

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

{
  "functionName1":
  {
     "inputs":
     [
        {"name":"in1",  "kind":"required", "type":["numeric"]},
        {"name":"in2",  "kind":"required", "type":["numeric","integer","scalar"]}
     ]
  }
}

Порядок, что входные параметры появляются в файле JSON, является значительным. Например, в вызове функции functionName1, in1 должен появиться перед in2.

Каждый объект аргумента может включать следующие свойства.

 имя Имя аргумента

 kind – Вид аргумента

 ввод Класс и/или атрибуты аргумента

 Аргумент repeating - Specify многократно

 purpose – Описание аргумента

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

 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 использует это функциональное описание подписи, чтобы сообщить предложениям кода и завершению.

Чтобы экспериментировать с предложениями кода, начните вызывать функцию от live скрипта и наблюдать предложения. Например, имена и цели из файла 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"]}
            ]
           ]
        }
     ]
  }
}

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

Похожие темы

Внешние веб-сайты

Была ли эта тема полезной?