主要内容

更新代码以接受字符串

如果你写其他的MATLAB代码®用户,那么更新您的API以接受字符串数组,同时保持与其他文本数据类型的向后兼容性将对您有利。采用字符串使您的代码与MathWorks一致®下载188bet金宝搏产品。

如果代码的依赖关系很少,或者正在开发新代码,那么可以考虑使用字符串数组作为主要文本数据类型,以获得更好的性能。在这种情况下,最佳实践是编写或更新API以接受字符向量、字符向量的单元格数组或字符串数组等输入参数。

有关字符串数组和其他术语的定义,请参见字符和字符串数组术语

什么是字符串数组?

在MATLAB中,可以用两种方式存储文本数据。一种方法是使用字符数组,它是一个字符序列,就像数字数组是一个数字序列一样。另一种方法是将字符序列存储在字符串.可以在a中存储多个字符串字符串数组.有关更多信息,请参见字符和字符串

在旧api中采用字符串的推荐方法

当您的代码有许多依赖项,并且必须保持向后兼容性时,请遵循以下方法来更新函数和类,以提供兼容的API。

功能

  • 接受字符串数组作为输入参数。

    • 如果输入参数可以是字符向量或字符向量的单元数组,则更新代码,使参数也可以是字符串数组。例如,考虑一个函数,它的输入参数可以指定为字符向量(使用单引号)。最佳实践是更新函数,使参数可以指定为字符向量或字符串标量(使用双引号)。

  • 在名称-值对参数中接受字符串作为名称和值。

    • 在名称-值对参数中,允许将名称指定为字符向量或字符串——也就是说,在名称周围使用单引号或双引号。如果值可以是字符向量或字符向量的单元数组,则更新代码,使其也可以是字符串数组。

  • 不要接受字符串数组的单元格数组作为文本输入参数。

    • 字符串数组的单元格数组在每个单元格中都有一个字符串数组。例如,{“你好”、“世界”}是字符串数组的单元格数组。虽然您可以创建这样的单元格数组,但不建议将其用于存储文本。字符串数组的元素具有相同的数据类型,并且存储效率很高。如果将字符串存储在单元格数组中,那么就失去了使用字符串数组的优点。

      但是,如果代码接受异构单元格数组作为输入,则应考虑接受包含字符串的单元格数组。您可以将这种单元格数组中的任何字符串转换为字符向量。

  • 一般情况下,不要更改输出类型。

    • 如果函数返回字符向量或字符向量的单元数组,则不要更改输出类型,即使函数接受字符串数组作为输入。例如,fileread函数接受指定为字符向量或字符串的输入文件名,但该函数将文件内容作为字符向量返回。通过保持输出类型相同,可以保持向后兼容性。

  • 当函数修改输入文本时返回相同的数据类型。

    • 如果函数修改输入文本并返回修改后的文本作为输出参数,那么输入和输出参数应该具有相同的数据类型。例如,较低的函数接受文本作为输入参数,将其转换为全小写字母,然后返回。如果输入参数是字符向量,则较低的返回一个字符向量。如果输入是字符串数组,则较低的返回一个字符串数组。

  • 考虑添加一个“TextType”参数导入函数。

    • 如果您的函数从文件中导入数据,并且其中至少有一些数据可以是文本,那么请考虑添加一个输入参数,该参数指定是将文本作为字符数组还是字符串数组返回。例如,readtable函数提供“TextType”名称-值对参数。这个参数指定了readtable返回一个以字符向量单元格数组或字符串数组形式表示文本的表。

  • 将方法视为函数。

    • 对于字符串采用,将方法视为函数。接受字符串数组作为输入参数,一般情况下,不要更改输出参数的数据类型,如前一节所述。

  • 不要更改属性的数据类型。

    • 如果属性是字符向量或字符向量的单元数组,则不要更改其类型。当您访问这样的属性时,返回的值仍然是字符向量或字符向量的单元数组。

      作为一种替代方法,您可以添加一个字符串的新属性,并使其依赖于旧属性以保持兼容性。

  • 使用字符串数组设置属性。

    • 如果您可以使用字符向量或字符向量的单元数组来设置属性,那么也可以更新您的类来使用字符串数组来设置该属性。但是,不要更改属性的数据类型。相反,应将输入字符串数组转换为属性的数据类型,然后设置属性。

  • 添加一个字符串方法。

    • 如果你的类已经有字符和/或cellstr方法,然后添加字符串方法。如果您可以将类的对象表示为字符向量或字符向量的单元数组,那么也可以将其表示为字符串数组。

如何在旧api中采用字符串数组

您可以在旧api中采用字符串,方法是接受字符串数组作为输入参数,然后将它们转换为字符向量或字符向量的单元数组。如果在函数开始时执行这样的转换,则不需要更新函数的其余部分。

convertStringsToChars函数提供了一种处理所有输入参数的方法,只转换那些字符串数组的参数。要使现有代码能够接受字符串数组作为输入,请添加对convertStringsToChars在函数和方法的开头。

例如,如果您定义了一个函数myFunc它接受三个输入参数,使用convertStringsToChars.保持代码的其余部分不变。

函数y = myFunc(a,b,c) [a,b,c] = convertstringstars (a,b,c);<的第一行原始代码><第2行原始代码>

在本例中,参数(a, b, c)就地覆盖输入参数。如果任何输入参数不是字符串数组,则不会改变它。

如果myFunc接受数目可变的输入参数,然后处理由变长度输入宗量

函数y = myFunc(varargin) [varargin{:}] = convertStringsToChars(varargin{:});

性能考虑

convertStringsToChars函数在转换一个输入参数时效率更高。如果函数对性能敏感,则可以一次转换一个输入参数,同时保持其余代码不变。

函数y = myFunc(a,b,c) a = convertStringsToChars(a);b = convertStringsToChars(b);c = convertStringsToChars(c);

在新代码中采用字符串的推荐方法

当您的代码几乎没有依赖关系,或者您正在开发全新的代码时,请考虑使用字符串数组作为主要文本数据类型。字符串数组在处理大量文本时提供了良好的性能和有效的内存使用。与字符向量的单元格数组不同,字符串数组具有同构数据类型。字符串数组使编写可维护的代码变得更容易。要在使用字符串数组的同时保持与其他文本数据类型的向后兼容性,请遵循以下方法。

功能

  • 接受任何文本数据类型作为输入参数。

    • 如果输入参数可以是字符串数组,那么也允许它是字符向量或字符向量的单元数组。

  • 接受字符数组作为名称-值对参数中的名称和值。

    • 在名称-值对参数中,允许将名称指定为字符向量或字符串——也就是说,在名称周围使用单引号或双引号。如果一个值可以是字符串数组,那么也允许它是字符向量或字符向量的单元数组。

  • 不要接受字符串数组的单元格数组作为文本输入参数。

    • 字符串数组的单元格数组在每个单元格中都有一个字符串数组。虽然您可以创建这样的单元格数组,但不建议将其用于存储文本。如果您的代码使用字符串作为主要文本数据类型,请在字符串数组中存储多段文本,而不是字符串数组的单元格数组。

      但是,如果代码接受异构单元格数组作为输入,则应考虑接受包含字符串的单元格数组。

  • 一般来说,返回字符串。

    • 如果函数返回的输出参数是文本,那么将它们作为字符串数组返回。

  • 当函数修改输入文本时返回相同的数据类型。

    • 如果函数修改输入文本并返回修改后的文本作为输出参数,那么输入和输出参数应该具有相同的数据类型。

  • 将方法视为函数。

    • 接受字符向量和字符向量的单元数组作为输入参数,如前一节所述。通常,返回字符串作为输出。

  • 将属性指定为字符串数组。

    • 如果属性包含文本,则使用字符串数组设置该属性。访问该属性时,将值作为字符串数组返回。

如何在新代码中保持兼容性

在编写新代码或修改代码以使用字符串数组作为主要文本数据类型时,请保持与其他文本数据类型的向后兼容性。您可以接受字符向量或字符向量的单元数组作为输入参数,然后立即将它们转换为字符串数组。如果在函数的开头执行这样的转换,那么代码的其余部分只能使用字符串数组。

convertCharsToStrings函数提供了一种处理所有输入参数的方法,只转换那些字符向量或字符向量的单元数组的参数。要使新代码能够接受这些文本数据类型作为输入,请添加对的调用convertCharsToStrings在函数和方法的开头。

例如,如果您定义了一个函数myFunc它接受三个输入参数,使用convertCharsToStrings

函数y = myFunc(a,b,c) [a,b,c] = convertCharsToStrings(a,b,c);<的第一行原始代码><第2行原始代码>

在本例中,参数(a, b, c)就地覆盖输入参数。如果任何输入参数不是字符向量或字符向量的单元数组,则不会改变它。

如果myFunc接受数目可变的输入参数,然后处理由变长度输入宗量

函数y = myFunc(varargin) [varargin{:}] = convertCharsToStrings(varargin{:});

性能考虑

convertCharsToStrings函数在转换一个输入参数时效率更高。如果函数对性能敏感,则可以一次转换一个输入参数,同时保持其余代码不变。

函数y = myFunc(a,b,c) a = convertCharsToStrings(a);b = convertCharsToStrings(b);c = convertCharsToStrings(c);

如何手动转换输入参数

如果可能的话,避免手动转换包含文本的输入参数,而使用convertStringsToCharsconvertCharsToStrings功能。检查输入参数的数据类型并自己转换它们是一种乏味的方法,容易出错。

如果必须转换输入参数,则使用该表中的函数。

转换

函数

字符串标量到字符向量

字符

字符串数组到字符向量的单元数组

cellstr

到字符串标量的字符向量

字符串

字符向量到字符串数组的单元格数组

字符串

如何检查参数数据类型

要检查可能包含文本的输入参数的数据类型,请考虑使用下表所示的模式。

输入参数类型

旧的检查

新检查

字符向量或字符串标量

ischar (X)

isStringScalar(X)

validateattributes (X,{“字符”,“弦”},{' scalartext '})

字符向量或字符串标量

validateattributes (X, {char的},{'行'})

validateattributes (X,{“字符”,“弦”},{' scalartext '})

非空字符向量或字符串标量

ischar(X) && ~isempty(X)

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

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

字符向量或字符串数组的单元格数组

iscellstr (X)

isellstr (X) || isstring(X)

任何文本数据类型

ischar(X) || iscellstr(X)

ischar(X) || isellstr (X) || isstring(X)

检查空字符串

一个空字符串是一个没有字符的字符串。MATLAB将空字符串显示为一对双引号,中间没有任何内容(”“)。然而,空字符串仍然是一个1乘1的字符串数组。它是空数组。

检查字符串是否为空的建议方法是使用strlength函数。

str =”“;Tf = (strlength(str) ~= 0)

请注意

使用isempty函数检查是否为空字符串。空字符串没有字符,但仍然是一个1乘1的字符串数组。

strlength函数返回字符串数组中每个字符串的长度。如果字符串必须是字符串标量,并且不为空,则检查这两个条件。

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

如果str可以是一个字符向量或者字符串标量,那么你还能用吗strlength来确定它的长度。strlength返回0如果输入参数是一个空字符向量()。

if = ((ischar(str) b| isStringScalar(str)) && strlength(str) ~= 0)

检查是否为空字符串数组

一个空字符串数组实际上是一个空数组——也就是说,一个至少有一个维度的数组,其长度为0

创建空字符串数组的推荐方法是使用字符串函数,指定0作为至少一个输入参数。的isempty函数返回1当输入为空字符串数组时。

STR = strings(0);Tf = isempty(str)

strlength函数返回一个与输入字符串数组大小相同的数值数组。如果输入是空字符串数组,则strlength返回一个空数组。

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

检查缺少的字符串

字符串数组也可以包含失踪的字符串.缺失的字符串相当于用于数值数组。它指示字符串数组中缺少值的位置。缺失的字符串显示为< >失踪,没有引号。

方法创建丢失的字符串失踪函数。检查是否缺少字符串的推荐方法是使用ismissing函数。

STR = string(缺失);Tf = ismissing(str)

请注意

通过将字符串与丢失的字符串进行比较来检查是否存在丢失的字符串。

丢失的字符串不等于它自己,就像不等于它自己。

STR = string(缺失);F = (str == missing)

字符和字符串数组术语

MathWorks文档使用这些术语来描述字符和字符串数组。为了保持一致性,请在您自己的文档、错误消息和警告中使用这些术语。

  • 字符向量-1——- - - - - -n数据类型的字符数组字符

  • 字符数组-——- - - - - -n数据类型的字符数组字符

  • 字符向量的单元数组-每个单元包含一个字符向量的单元数组。

  • 字符串字符串标量-1——- - - - - -1字符串数组。字符串标量可以包含1——- - - - - -n字符序列,但它本身是一个对象。当需要精确地描述大小和数据类型时,请同时使用术语“字符串标量”和“字符向量”。否则,您可以在描述中使用术语“字符串”。

  • 字符串向量-1——- - - - - -nn——- - - - - -1字符串数组。如果只有一种尺寸是可能的,那么在你的描述中使用它。例如,使用“1——- - - - - -n字符串数组"来描述该大小的数组。

  • 字符串数组-——- - - - - -n字符串数组。

  • 空字符串-没有字符的字符串标量。

  • 空字符串数组-至少有一个维度的字符串数组,其大小为0

  • 缺失字符串-缺失值的字符串标量(显示为< >失踪)。

另请参阅

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

相关的话题