On this page |
概要 ¶
VEXには文字列のデータタイプがあります。これは、いくつかの場面で役に立ちます:
-
テキストの制御
-
ファイル名やノード名の参照
-
バイナリデータの制御
文字列リテラル ¶
文字列リテラルは、シングルクォート('
)またはダブルクォート("
)で閉じます。
PythonまたはC++のRaw文字列形式を使って文字列を指定することもできます。
string s = 'foo'; string t = "bar"; string py = r"Hello world\n"; // Python形式。これは"Hello world\\n"と等価です。 string cpp = R"(Hello world\n)"; // C++形式。これは"Hello world\\n"と等価です。
エスケープ文字列(非Raw文字列)は、予め定義されているエスケープ文字シーケンスを自動的に別の文字シーケンスに変換します。 例えば、“\n”は、改行を意味するASCIIバイトに変換します。
Raw文字列は、完全にそのエスケープ文字シーケンスを無視します。
Raw文字列では、“\n”は、バックスラッシュと小文字のn
にそのまま変換されます。
文字列の構文の概要は以下のとおりです。
-
エスケープ文字列
"text"
または'text'
-
PythonのRaw文字列
r"raw text"
-
C++のRaw文字列
R"delimiter(raw text)delimiter"
delimiter
は、0から16文字までのオプションの文字列です。 PythonのRaw文字列とは違い、C++形式のRaw文字列には、複数行のテキストとバイナリデータも含めることができます。
string escaped = 'Line 1\nLine 2'; string raw = r"Line 1\nLine 1 continues"; // "Line 1\\nLine 1 continues" string cppraw = R"(Line 1\nLine 1 continues)"; // "Line 1\\nLine 1 continues" string cppmultiline = R"multi(This is a long string which has multiple lines. The string also contains an embedded raw string R"(raw string)" But since the delimiter doesn't match, the string isn't actually ended until here.)multi";
WrangleやVEXpressionでのエスケープシーケンス ¶
Houdini内でVEXコードを直接記述することがほとんどないことに気づくことは重要です。 その代わりに、記述したスニペットは、VOPでチャンネル参照されて、コード生成に使用されています。 Attribute Wrangleから最終VEXまでの一連の変換では、多くの置換が行なわれることになります。
特に$
文字は、環境変数の展開を開始し、\
文字は、VEXがコードを受け取る 前 にエスケープシーケンスを発動します。
VEXの View Code オプションを使用することで、その変換過程のすべての結果を確認することができます。
chr(92)
でバックスラッシュを、chr(36)
でドル記号を生成することができます。
文字列タイプの宣言 ¶
文字列変数を宣言する一般形式は、string var_name
です:
// mystringは通常の文字列です。 string mystring;
文字列を返す関数を定義するには:
// 文字列を返す関数。 string rgb_name() { ... };
リテラル配列を指定するには、ダブルクォートまたはシングルクォートを使用します。
string a_string = "hello world!"; string another_string = 'good-bye!'
文字列値へのアクセスと設定 ¶
配列内の特定の位置の文字を調べるには、string[index]
を使用します。
このindexは、文字列のバイトオフセットであり文字オフセットではありません。 これはUnicode文字列を扱う時に重要になってきます。 VEXは、すべての文字列をUTF-8エンコードであると見なします。 指定したオフセットが有効なUTF-8文字でなかった場合には、空っぽの文字列が返されます。 そうでないなら、フルのUTF-8文字が返されます。つまり、これは長さが2以上の文字列です!
文字列範囲は実行時にチェックされます。 その範囲外を読み込むと、空っぽの文字列が返されます。 これは将来、警告やオプションでランタイムエラーを生成できるようにするつもりです。
Python形式のインデックスが使われています。 つまり、マイナスのインデックスは、配列の最後からカウントします。
slice表記には大括弧を使用し、文字列の範囲を抽出することができます。 これは、バイトシーケンスに作用し、従来の大括弧処理によってUTF-8を1文字ずつ処理することができます。 そのため、3番目のバイトが必要であれば、UTF-8の有効無効に関係なく、以下のコードを使用します:
string a_string = "hello world!"; string thirdbyte = a_string[2:3];
大括弧を使用して配列に値を割り当てることができません。
(getcomp関数は、大括弧表記の使用と等価です。)
文字列に対するループ ¶
foreachを参照してください。
Note
有効なUnicode文字に相当しないオフセットでは空っぽの文字列が取得されます。