====== String ======
文字列型です。
Stringを明示するほか、文字列リテラルを利用することで生成されます。
短い文字列はメンバの配列に入れることで効率化が図られています。
また、ほとんどの組み込み型には文字列を返す.to_sという関数が定義されており、.pで出力する際にはその値が用いられます。
ユーザー定義型に関しても.to_sをオーバーロードすることで同じように扱うことができます。
===== Example =====
==== C++ ====
void exec_xtal(){
StringPtr str1("foo");
StringPtr str2(xnew("bar"));
str1->p();
str2->p();
StringPtr str(str1->cat(str2));
str->p();
StringPtr num(AnyPtr(100)->to_s());
num->p();
}
==== Xtal ====
str1 : "foo";
str2 : "bar";
str1.p;
str2.p;
str : str1~str2;
str.p;
num : 100.to_s();
num->p();
==== Output ====
foo
bar
foobar
100
===== Method =====
|Xtal|C++|name| description|
|o|o|(constructor)| インスタンス生成|
|x|o|c_str| C文字列を返す|
|x|o|data| 文字列の先頭アドレスを返す|
|x|o|data_size| マルチバイト文字を考慮せずサイズを返す|
|o|o|length| マルチバイト文字を考慮した文字列長を返す|
|o|o|clone| 浅いコピー|
|x|o|intern| 一意化した文字列を返す|
|x|o|is_interned| 一意化されているかどうか|
|x|o|cat| 引数と連結した文字列を返す|
|o|o|is_ch| 1文字文字列かどうか|
|x|o|is_empty| 空文字列かどうか|
|x|o|empty| is_emptyと同一|
|o|o|ascii| 1文字文字列の場合そのasciiコードを返す|
|o|x|each| イテレータを返す|
|o|o|[[.:string:scan]]| 文字列をスキャンする|
|o|o|[[.:string:split]]| 文字列を分割し、Iteratorを返す|
|x|o|[[.:string:match_cpp]]| マッチするかどうか|
|o|x|[[.:string:match_xtal]]| matchメソッドを呼んだ後のExecutorを返す|
|o|o|[[.:string:gsub]]| マッチする部分を置き換えた文字列を返す|
|o|o|[[.:string:sub]]| 最初にマッチする部分を置き換えた文字列を返す|
===== Xtal operator =====
|operator ()| 自分自身を返す|
|operator ..| 範囲生成|
|operator ~| 文字列連結|
|operator ~=| 文字列連結代入|
|operator ==| 辞書順で比較|
|operator <| 辞書順で比較|
|[[.:string:operator_in]]| 1文字文字列のみに有効、ChRange内かどうかを返す|
===== Tips =====
==== イテレート ====
Stringのイテレータはマルチバイト文字も考慮した1文字ずつのアクセスを提供します。
str : "いろはabc";
str{
it.p;
}
Output
い
ろ
は
a
b
c
==== インデックスアクセス ====
インデックスを直接指定して文字を得る手段が用意されていないため、まず一文字文字列の配列に変換してからアクセスすることとなります。
その際、マルチバイト文字が考慮されるため、例えば「いろはabc」という文字列があったら、[い, ろ, は, a, b, c]という風に配列化されます。
str : "いろはabc";
stra : str[];
stra.p;
stra[3].p;
stra[1].p;
Output
[い, ろ, は, a, b, c]
a
ろ