exponenta event banner

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

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

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

Если у кода мало зависимостей или вы разрабатываете новый код, попробуйте использовать массивы строк в качестве основного типа текстовых данных для повышения производительности. В этом случае рекомендуется записать или обновить 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);
    ...

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

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

Функции

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

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

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

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

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

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

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

  • В общем, возвращать строки.

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

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

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

Классы

  • Рассматривать методы как функции.

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

  • Укажите свойства в виде массивов строк.

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

Как поддерживать совместимость в новом коде

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

convertCharsToStrings функция обеспечивает способ обработки всех входных аргументов, преобразуя только те аргументы, которые являются символьными векторами или массивами ячеек символьных векторов. Чтобы новый код мог принимать эти текстовые типы данных в качестве входных данных, добавьте вызов 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)

Любой текстовый тип данных

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 string array "для описания массива такого размера.

  • Строковый массив - mоколо-n строковый массив.

  • Пустая строка - скаляр строки, не содержащий символов.

  • Пустой строковый массив - строковый массив по крайней мере с одним измерением, размер которого равен 0.

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

См. также

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

Связанные темы