Обновите свой код, чтобы принять строки

В R2016b MATLAB® ввел строковые массивы как тип данных для текста. С R2018b все продукты MathWorks® совместимы со строковыми массивами. Совместимый означает, что, если можно задать текст как вектор символов или массив ячеек из символьных векторов, затем также можно задать его как массив строк. Теперь можно принять строковые массивы как тип данных text в собственном коде.

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

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

Для определений массива строк и других условий, смотрите Терминологию для Символьных массивов и Строковых массивов.

Что такое строковые массивы?

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

Рекомендуемые подходы для принятия строки в старых API

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

Функции

  • Примите строковые массивы как входные параметры.

    • Если входной параметр может быть или вектором символов или массивом ячеек из символьных векторов, затем обновить ваш код так, чтобы аргумент также мог быть массивом строк. Например, рассмотрите функцию, которая имеет входной параметр, который можно задать как вектор символов (использующий одинарные кавычки). Лучшая практика состоит в том, чтобы обновить функцию так, чтобы аргумент мог быть задан или как вектор символов или как строковый скаляр (использующий двойные кавычки).

  • Примите строки и как имена и как значения в аргументах пары "имя-значение".

    • В аргументах пары "имя-значение" позвольте именам быть заданными или как векторы символов или как строки — то есть, или с одинарными или двойными кавычками вокруг имени. Если значение может быть вектором символов или массивом ячеек из символьных векторов, затем обновить ваш код так, чтобы это также мог быть массив строк.

  • Не принимайте массивы ячеек строковых массивов для аргументов ввода текста.

    • Массив ячеек строковых массивов имеет массив строк в каждой ячейке. Например, {"hello","world"} массив ячеек строковых массивов. В то время как можно создать такой массив ячеек, он не рекомендуется для хранения текста. Элементы массива строк имеют совпадающий тип данных и хранятся эффективно. Если вы храните строки в массиве ячеек, то вы теряете преимущества использования массива строк.

      Однако, если ваш код принимает неоднородные массивы ячеек как входные параметры, то рассмотрите массивы ячеек принятия, которые содержат строки. Можно преобразовать любые строки в таком массиве ячеек к векторам символов.

  • В общем случае не изменяйте выходной тип.

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

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

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

  • Рассмотрите добавление 'TextType' аргумент, чтобы импортировать функции.

    • Если ваша функция импортирует данные из файлов, и по крайней мере некоторые из тех данных могут быть текстом, то рассмотреть добавление входного параметра, который задает, возвратить ли текст как символьный массив или массив строк. Например, readtable функция обеспечивает 'TextType' аргумент пары "имя-значение". Этот аргумент задает ли readtable возвращает таблицу с текстом в массивах ячеек из символьных векторов или строковых массивах.

Классы

  • Обработайте методы как функции.

    • Для принятия строки обработайте методы, как будто они - функции. Примите строковые массивы как входные параметры, и в целом, не изменяйте тип данных выходных аргументов, как описано в предыдущем разделе.

  • Не изменяйте типы данных свойств.

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

      Как альтернатива, можно добавить новое свойство, которое является строкой, и сделайте его зависящим от старого свойства обеспечить совместимость.

  • Установите свойства с помощью строковых массивов.

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

  • Добавьте string метод.

    • Если ваш класс уже имеет char и/или cellstr метод, затем добавьте string метод. Если можно представлять объект класса как вектор символов или массив ячеек из символьных векторов, то представляйте его как массив строк также.

Как принять строковые массивы в старых API

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

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

Например, если вы задали функциональный myFunc это принимает три входных параметра, процесс все три входных параметров с помощью convertStringsToChars. Оставьте остальную часть вашего кода неизменной.

function y = myFunc(a,b,c)
    [a,b,c] = convertStringsToChars(a,b,c);
    <line 1 of original code>
    <line 2 of original code>
    ...

В этом примере, аргументах [a,b,c] перезапишите входные параметры на месте. Если какой-либо входной параметр не является массивом строк, то это неизменно.

Если myFunc принимает переменное количество входных параметров, затем процесс все аргументы, заданные varargin.

function y = myFunc(varargin)
    [varargin{:}] = convertStringsToChars(varargin{:});
    ...

Факторы производительности

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

function y = myFunc(a,b,c)
    a = convertStringsToChars(a);
    b = convertStringsToChars(b);
    c = convertStringsToChars(c);
    ...

Рекомендуемые подходы для принятия строки в новом коде

Когда ваш код имеет немного зависимостей, или вы разрабатываете совершенно новый код, рассматриваете использование массивов строк как первичного типа данных text. Строковые массивы обеспечивают хорошую производительность и эффективное использование памяти при работе с большими суммами текста. В отличие от массивов ячеек из символьных векторов, строковые массивы имеют тип гомогенных данных. Строковые массивы облегчают писать удобный в сопровождении код. Чтобы использовать строковые массивы при поддержании обратной совместимости к другим типам данных text, следуйте за этими подходами.

Функции

  • Примите любые типы данных text как входные параметры.

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

  • Примите символьные массивы и как имена и как значения в аргументах пары "имя-значение".

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

  • Не принимайте массивы ячеек строковых массивов для аргументов ввода текста.

    • Массив ячеек строковых массивов имеет массив строк в каждой ячейке. В то время как можно создать такой массив ячеек, он не рекомендуется для хранения текста. Если ваши строки использования кода как первичный тип данных text, сохраните несколько частей текста в массиве строк, не массив ячеек строковых массивов.

      Однако, если ваш код принимает неоднородные массивы ячеек как входные параметры, то рассмотрите массивы ячеек принятия, которые содержат строки.

  • В общем случае возвращаемые строки.

    • Если ваша функция возвращает выходные аргументы, которые являются текстом, то возвращают их как строковые массивы.

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

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

Классы

  • Обработайте методы как функции.

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

  • Задайте свойства как строковые массивы.

    • Если свойство содержит текст, то установленный свойство с помощью массива строк. Когда вы получаете доступ к свойству, возвращаете значение как массив строк.

Как обеспечить совместимость в новом коде

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

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

Например, если вы задали функциональный myFunc это принимает три входных параметра, процесс все три входных параметров с помощью convertCharsToStrings.

function y = myFunc(a,b,c)
    [a,b,c] = convertCharsToStrings(a,b,c);
    <line 1 of original code>
    <line 2 of original code>
    ...

В этом примере, аргументах [a,b,c] перезапишите входные параметры на месте. Если какой-либо входной параметр не является вектором символов или массивом ячеек из символьных векторов, то это неизменно.

Если myFunc принимает переменное количество входных параметров, затем процесс все аргументы, заданные varargin.

function y = myFunc(varargin)
    [varargin{:}] = convertCharsToStrings(varargin{:});
    ...

Факторы производительности

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

function y = myFunc(a,b,c)
    a = convertCharsToStrings(a);
    b = convertCharsToStrings(b);
    c = convertCharsToStrings(c);
    ...

Как вручную преобразовать входные параметры

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

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

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

Функция

Строковый скаляр к вектору символов

char

Массив строк к массиву ячеек из символьных векторов

cellstr

Вектор символов к строковому скаляру

string

Массив ячеек из символьных векторов к массиву строк

string

Как проверять типы данных аргумента

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

Необходимый тип входного параметра

Старая проверка

Новая проверка

Вектор символов или строковый скаляр

ischar(X)

ischar(X) || isStringScalar(X)

validateattributes(X,{'char','string'},{'scalartext'})

Вектор символов или строковый скаляр

validateattributes(X,{'char'},{'row'})

validateattributes(X,{'char','string'},{'scalartext'})

Непустой вектор символов или строковый скаляр

ischar(X) && ~isempty(X)

(ischar(X) || isStringScalar(X)) && strlength(X) ~= 0

(ischar(X) || isStringScalar(X)) && X ~= ""

Массив ячеек из символьных векторов или массив строк

iscellstr(X)

iscellstr(X) || isstring(X)

Любой тип данных text

ischar(X) || iscellstr(X)

ischar(X) || iscellstr(X) || isstring(X)

Проверяйте на пустые строки

Пустая строка является строкой без символов. MATLAB отображает пустую строку как пару двойных кавычек ни с чем между ними (""). Однако пустая строка является все еще массивом строк 1 на 1. Это не пустой массив.

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

str = "";
tf = (strlength(str) ~= 0)

Примечание

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

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

tf = (isStringScalar(str) && strlength(str) ~= 0)

Если str мог быть или вектор символов или строковый скаляр, затем все еще можно использовать strlength определить его длину. strlength возвращает 0 если входной параметр является пустым символьным вектором ('').

tf = ((ischar(str) || isStringScalar(str)) && strlength(str) ~= 0)

Проверяйте на массивы пустой строки

Массив пустой строки является, на самом деле, пустым массивом — то есть, массив, который имеет по крайней мере одну размерность, длиной которой является 0.

Рекомендуемый способ создать массив пустой строки состоит в том, чтобы использовать strings функция, задавая 0 как по крайней мере один из входных параметров. isempty функция возвращает 1 когда вход является массивом пустой строки.

str = strings(0);
tf = isempty(str)

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

str = strings(0);
L = strlength(str)

Проверяйте на отсутствующие строки

Строковые массивы также могут содержать отсутствующие строки. Отсутствующая строка является строкой, эквивалентной NaN для числовых массивов. Это указывает, где массив строк имеет отсутствующие значения. Отсутствующая строка отображается как <missing>, без кавычек.

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

str = string(missing);
tf = ismissing(str)

Примечание

Не проверяйте на отсутствующие строки путем сравнения строки с отсутствующей строкой.

Отсутствующая строка не равна себе, так же, как NaN не равно себе.

str = string(missing);
f = (str == missing)

Терминология для символьных массивов и строковых массивов

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

  • Вектор символов — 1- n массив символов, типа данных char.

  • Символьный массив — m- n массив символов, типа данных char.

  • Массив ячеек из символьных векторов Массив ячеек, в котором каждая ячейка содержит вектор символов.

  • Строка или строковый скаляр — 1- 1 массив строк. Строковый скаляр может содержать 1- n последовательность символов, но самостоятельно один объект. Используйте термины "строковый скаляр" и "вектор символов" друг вместе с другом, когда быть точными о размере и типе данных. В противном случае можно использовать термин "строка" в описаниях.

  • Вектор строки — 1- n или n- 1 массив строк. Если только один размер возможен, то используйте его в своем описании. Например, используйте "1- n массив строк", чтобы описать массив того размера.

  • Массив строк — m- n массив строк.

  • Пустая строка — Строковый скаляр, который не имеет никаких символов.

  • Массив пустой строки — Массив строк по крайней мере с одной размерностью, размером которой является 0.

  • Отсутствующая строка — Строковый скаляр, который является отсутствующим значением (отображения как <missing>).

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

| | | | | | | | | | | |

Похожие темы