Main Content

コードを更新して string を受け入れる

他の MATLAB® ユーザーのためにコードを記述する場合、他のテキスト データ型との下位互換性を維持しながら string 配列を受け入れることができるように API を更新すると便利です。string の採用によって、コードに MathWorks® 製品との整合性を持たせることができます。

コードに依存関係がほとんどない場合や新しいコードを開発している場合、パフォーマンス向上のため、主なテキスト データ型として string 配列を使用することを検討してください。その場合のベスト プラクティスは、文字ベクトル、文字ベクトルの cell 配列、または string 配列である入力引数を受け入れるように API を記述または更新することです。

string 配列およびその他の用語の定義については、文字配列と string 配列の用語を参照してください。

string 配列とは

MATLAB にはテキスト データを格納する方法が 2 つあります。1 つは文字配列を使用する方法です。数値配列が数字のシーケンスであるように、文字配列は文字のシーケンスです。もう 1 つの方法は、文字のシーケンスを "string" に格納することです。複数の string を 1 つの "string 配列" に格納できます。詳細については、文字と文字列を参照してください。

古い API で string を採用するための推奨の方法

コードに多くの依存関係が含まれていて下位互換性を維持しなければならない場合、以下の方法に従って関数とクラスを更新し、互換性のある API を提供します。

関数

  • 入力引数として string 配列を受け入れる。

    • 入力引数を文字ベクトルまたは文字ベクトルの cell 配列のいずれかにできる場合、その引数を string 配列にもできるようにコードを更新します。たとえば、(一重引用符を使用して) 文字ベクトルとして指定できる入力引数をもつ関数があるとします。ベスト プラクティスは、引数を (二重引用符を使用して) 文字ベクトルまたは string スカラーのいずれかとして指定できるように関数を更新することです。

  • 名前と値のペアの引数で、名前と値の両方として string を受け入れる。

    • 名前と値のペアの引数で、名前を文字ベクトルと string のどちらでも指定できるように、つまり名前を一重引用符と二重引用符のどちらでも囲めるようにします。値を文字ベクトルまたは文字ベクトルの cell 配列にできる場合は、string 配列にもできるようにコードを更新します。

  • テキスト入力引数として string 配列の cell 配列を受け入れない。

    • string 配列の cell 配列では、各 cell に string 配列が含まれています。たとえば、{"hello","world"} は複数の string 配列からなる cell 配列です。このような cell 配列を作成することは可能ですが、テキストの格納には推奨されません。string 配列の要素はデータ型が同じであり、効率的に格納されます。string を cell 配列に格納すると、string 配列を使用する利点が失われます。

      ただし、コードが入力として異種混合 cell 配列を受け入れる場合には、string を含む cell 配列を受け入れることを検討します。そのような cell 配列にある string はすべて文字ベクトルに変換できます。

  • 一般に、出力タイプは変更しない。

    • 関数が文字ベクトルまたは文字ベクトルの cell 配列を返す場合、その関数が入力として string 配列を受け入れるとしても、出力タイプは変更しないでください。たとえば、関数 fileread は、文字ベクトルまたは string として指定されている入力ファイル名を受け入れますが、関数はそのファイルの内容を文字ベクトルとして返します。出力タイプを同じに保つことで下位互換性を維持できます。

  • 関数が入力テキストを変更する場合は同じデータ型を返す。

    • 関数が入力テキストを変更し、変更されたテキストを出力引数として返す場合、入力引数と出力引数は同じデータ型でなければなりません。たとえば、関数 lower は入力引数としてテキストを受け入れ、これをすべて小文字に変換して返します。入力引数が文字ベクトルの場合、lower は文字ベクトルを返します。入力が string 配列の場合、lower は string 配列を返します。

  • インポート関数に 'TextType' 引数を追加することを検討する。

    • 関数によってファイルからデータをインポートし、そのデータの少なくとも一部がテキストである場合、テキストを文字配列と string 配列のいずれかとして返すことを指定するため、入力引数の追加を検討してください。たとえば、関数 readtable'TextType' という名前と値のペア引数を提供します。この引数は、readtable によって返される table のテキストを、文字ベクトルの cell 配列と string 配列のどちらにするかを指定します。

クラス

  • メソッドを関数として取り扱う。

    • string を採用する場合、メソッドが関数であるかのように処理されます。入力引数として string 配列を受け入れ、一般に、前の節で説明されているように出力引数のデータ型は変更しません。

  • プロパティのデータ型は変更しない。

    • プロパティが文字ベクトルまたは文字ベクトルの cell 配列である場合、その型を変更しないでください。そのようなプロパティにアクセスする場合、返される値は文字ベクトルまたは文字ベクトルの cell 配列のままです。

      または、string である新しいプロパティを追加して、これを古いプロパティに依存させて互換性を維持することもできます。

  • string 配列を使用してプロパティを設定する。

    • 文字ベクトルまたは文字ベクトルの cell 配列を使ってプロパティを設定できる場合、string 配列を使ってそのプロパティを設定するようにクラスを更新します。ただし、プロパティのデータ型は変更しないでください。代わりに、入力の string 配列をプロパティのデータ型に変換してから、プロパティを設定します。

  • string メソッドを追加する。

    • クラスに charcellstr メソッドが既にある場合、string メソッドを追加します。クラスのオブジェクトを文字ベクトルまたは文字ベクトルの cell 配列として表現できる場合、これを string 配列としても表現します。

古い API での string 配列の採用方法

string 配列を入力引数として受け入れ、文字ベクトルまたは文字ベクトルの cell 配列に変換することにより、古い API で string を採用することができます。関数の冒頭でこの変換を実行すると、残りの部分を更新する必要がなくなります。

関数 convertStringsToChars を使用すると、すべての入力引数を処理し、string 配列である引数だけを変換することができます。既存の独自のコードで string 配列の入力を受け入れられるようにするには、コードおよびメソッドの先頭に convertStringsToChars の呼び出しを追加します。

たとえば、3 つの入力引数を受け入れる関数 myFunc を定義した場合、convertStringsToChars を使用して 3 つすべての入力を処理します。コードの他の部分は変更せずに残します。

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] が所定の位置の入力引数を上書きします。string 配列以外の入力引数は、すべて変更されません。

myFunc が可変の個数の入力引数を受け入れる場合は、varargin で指定された引数をすべて処理します。

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

パフォーマンスについての考慮事項

1 つの入力引数を変換する場合は関数 convertStringsToChars がより効率的です。関数のパフォーマンスが影響を受けやすい場合、一度に 1 つの入力引数を変換して、コードの残りは変更せずに残すことができます。

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

新しいコードで string を採用するための推奨の方法

コードに依存関係がほとんどない場合や、まったく新しいコードを開発している場合は、主なテキスト データ型として string 配列を使用することを検討してください。string 配列は、大量のテキストを処理する際に良好なパフォーマンスと効率的なメモリ使用を提供します。文字ベクトルの cell 配列とは異なり、string 配列は同種のデータ型をもちます。string 配列によって、維持可能なコードを記述しやすくなります。その他のテキスト データ型との下位互換性を維持したままで string 配列を使用するには、以下の方法に従ってください。

関数

  • 入力引数として任意のテキスト データ型を受け入れる。

    • 入力引数を string 配列にできる場合、それを文字ベクトルまたは文字ベクトルの cell 配列にもできるようにします。

  • 名前と値のペアの引数で、名前と値の両方として文字配列を受け入れる。

    • 名前と値のペアの引数で、名前を文字ベクトルと string のどちらでも指定できるように、つまり名前を一重引用符と二重引用符のどちらでも囲めるようにします。値を string 配列にできる場合は、文字ベクトルまたは文字ベクトルの cell 配列にもできるようにします。

  • テキスト入力引数として string 配列の cell 配列を受け入れない。

    • string 配列の cell 配列では、各 cell に string 配列が含まれています。このような cell 配列を作成することは可能ですが、テキストの格納には推奨されません。コードで主なテキスト データ型として string を使用する場合、複数のテキストは、string 配列の cell 配列ではなく string 配列に格納します。

      ただし、コードが入力として異種混合 cell 配列を受け入れる場合には、string を含む cell 配列を受け入れることを検討します。

  • 一般に、string を返す。

    • 関数がテキストの出力引数を返す場合、それらを string 配列として返します。

  • 関数が入力テキストを変更する場合は同じデータ型を返す。

    • 関数が入力テキストを変更し、変更されたテキストを出力引数として返す場合、入力引数と出力引数は同じデータ型でなければなりません。

クラス

  • メソッドを関数として取り扱う。

    • 前の節で説明されているように、入力引数として文字ベクトルおよび文字ベクトルの cell 配列を受け入れます。一般に、出力として string を返します。

  • プロパティを string 配列として指定する。

    • プロパティにテキストが含まれる場合、string 配列を使用してプロパティを設定します。プロパティにアクセスするときは、値を string 配列として返します。

新しいコードで互換性を維持する方法

コードを新しく記述する場合や、主なテキスト データ型として string 配列を使用するようコードを変更する場合には、その他のテキスト データ型との下位互換性を維持します。文字ベクトルまたは文字ベクトルの cell 配列を入力引数として受け入れてから、直ちにそれらを string 配列に変換できます。このような変換を関数の冒頭で実行した場合、コードの残りの部分では string 配列だけを使用できます。

関数 convertCharsToStrings を使用すると、すべての入力引数を処理して、文字ベクトルまたは文字ベクトルの cell 配列である引数のみを変換することができます。新しいコードでこれらのテキスト データ型の受け入れを有効にするには、関数およびメソッドの冒頭に convertCharsToStrings の呼び出しを追加します。

たとえば、3 つの入力引数を受け入れる関数 myFunc を定義した場合、convertCharsToStrings を使用して 3 つすべての入力を処理します。

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] が所定の位置の入力引数を上書きします。文字ベクトルまたは文字ベクトルの cell 配列でない入力引数がある場合、これらは変更されません。

myFunc が可変の個数の入力引数を受け入れる場合は、varargin で指定された引数をすべて処理します。

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

パフォーマンスについての考慮事項

1 つの入力引数を変換する場合は関数 convertCharsToStrings がより効率的です。関数のパフォーマンスが影響を受けやすい場合、一度に 1 つの入力引数を変換して、コードの残りは変更せずに残すことができます。

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

入力引数を手動で変換する方法

可能であれば、テキストを含む入力引数を手動で変換することを避け、代わりに関数 convertStringsToChars または convertCharsToStrings を使用してください。入力引数のデータ型を自分でチェックして変換するのは手間がかかり、エラーが発生しやすい方法です。

入力引数を変換しなければならない場合、次の表にある関数を使用してください。

変換

関数

string スカラーから文字ベクトル

char

string 配列から文字ベクトルの cell 配列

cellstr

文字ベクトルから string スカラー

string

文字ベクトルの cell 配列から string 配列

string

引数のデータ型をチェックする方法

テキストが含まれている可能性のある入力引数のデータ型をチェックするには、次の表に示すパターンの使用を検討してください。

必要な入力引数タイプ

古いチェック

新しいチェック

文字ベクトルまたは string スカラー

ischar(X)

ischar(X) || isStringScalar(X)

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

文字ベクトルまたは string スカラー

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

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

空でない文字ベクトルまたは string スカラー

ischar(X) && ~isempty(X)

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

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

文字ベクトルの cell 配列または string 配列

iscellstr(X)

iscellstr(X) || isstring(X)

任意のテキスト データ型

ischar(X) || iscellstr(X)

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

空の string のチェック

"空の string" は、文字を含まない string です。MATLAB では、空の string は間に何もない二重引用符のペア ("") として表示されます。ただし、空の string も 1 行 1 列の string 配列です。空の配列ではありません

string が空であるかをチェックするには、関数 strlength を使用する方法が推奨されます。

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

メモ

空の string のチェックに関数 isempty を使用しないでください。空の string は文字を含んでいませんが、1 行 1 列の string 配列です。

関数 strlength は、string 配列にある各 string の長さを返します。string が string スカラーでなければならず、空であってはならない場合、両方の条件をチェックします。

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

str が文字ベクトルまたは string スカラーのどちらでもよい場合には、strlength を使って長さを判別できます。strlength は、入力引数が空の文字ベクトル ('') である場合に 0 を返します。

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

空の string 配列のチェック

"空の string 配列" は、実際に空の配列です。つまり、この配列には、長さが 0 の次元が少なくとも 1 つあります。

空の string 配列を作成するには、関数 strings を使用して、少なくとも 1 つの入力引数に 0 を指定する方法が推奨されます。関数 isempty は、入力が空の string 配列である場合に 1 を返します。

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

関数 strlength は、入力 string 配列と同じサイズの数値配列を返します。入力が空の string 配列である場合、strlength は空の配列を返します。

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

欠損 string のチェック

string 配列には、"欠損 string" も含めることができます。欠損 string は、数値配列の NaN と等価の string です。string 配列のどこに欠損値があるかを示します。欠損 string は引用符なしの <missing> として表示されます。

欠損 string は関数 missing を使って作成できます。欠損 string をチェックするには、関数 ismissing を使用する方法が推奨されます。

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

メモ

string と欠損 string を比較する方法で欠損 string をチェックしないでください

NaN がそれ自体と等価でないのと同じように、欠損 string はそれ自体と等価ではありません。

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

文字配列と string 配列の用語

MathWorks ドキュメンテーションでは、文字配列と string 配列についての記述に以下の用語を使用しています。整合性を取るため、独自のドキュメンテーション、エラー メッセージ、および警告にもこれらの用語を使用してください。

  • 文字ベクトル — 1n 列で、データ型が char の文字の配列。

  • 文字配列 — mn 列で、データ型が char の文字の配列。

  • 文字ベクトルの cell 配列 — 各 cell に 1 つの文字ベクトルを含む cell 配列。

  • string "または" string スカラー — 11 列の string 配列。string スカラーは 1n 列の文字のシーケンスを含めることができますが、それ自体が 1 つのオブジェクトです。サイズとデータ型について正確に記述する場合、"string スカラー" と "文字ベクトル" という用語を並べて使用します。それ以外の場合は、説明に "string" という用語を使用できます。

  • string ベクトル — 1n 列または n1 列の string 配列。可能なサイズが 1 つだけの場合、それを説明に使用します。たとえば、そのサイズの配列を示すには "1n 列の string 配列" と記述します。

  • string 配列 — mn 列の string 配列。

  • 空の string — 文字をもたない string スカラー。

  • 空の string 配列 — 少なくとも 1 つの次元のサイズが 0 である string 配列。

  • 欠損 string — 欠損値である (<missing> と表示される) string スカラー。

参考

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

関連するトピック