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

В R2016b MATLAB® представил массивы строк как тип данных для текста. В будущем релизе все продукты 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);
    ...

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

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

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

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

Функция

Представьте скаляр в виде строки к вектору символа

'char'

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

cellstr

Вектор символа, чтобы представить скаляр в виде строки

строка

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

строка

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

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

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

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

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

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

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-by-n массив символов, типа данных char.

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

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

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

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

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

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

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

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

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

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

Похожие темы

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