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

В 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

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

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-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>).

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

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

Похожие темы