std.conv
値をある型から他の型へと変換する何でも屋です。 Source:std/conv.d Copyright:
Copyright Digital Mars 2007-. License:
Boost License 1.0. Authors:
Walter Bright, Andrei Alexandrescu, Shin Fujishiro, Adam D. Ruppe
- 変換の際にエラーが起きたときに投げられる例外です。
- 変換時にオーバーフローが起きたときの例外です。
- 適切な変換プリミティブへと処理を渡すエントリポイントです。 呼び出す際には通常はto!TargetType(value) という形で使います。 (直接 toImpl を呼ぶことはありません)
- 文字列から文字列への変換は、以下の文字型からなり
(char, wchar, dchar)
以下の修飾子 (mutable, const, immutable) のついた任意の組み合わせについて、可能です。
Example:
char[] a = "abc"; auto b = to!dstring(a); assert(b == "abc"w);
- (文字列以外の)配列を文字列に変換します。 左括弧、区切り文字、右括弧はカスタマイズ可能です。 それぞれ指定された値が to!T で文字列化され使われます。
- 連想配列から文字列への変換です。 左括弧、区切り文字、キーと値の区切り文字、右括弧はカスタマイズ可能です。 それぞれ指定された値が to!T で文字列化され使われます。
- オブジェクトから文字列への変換です。非nullならば toStringメソッドを呼び出し、 nullならば nullstr を返します。
- 構造体から文字列への変換です。 toString が定義されていれば呼び出します。
- toString を持たない構造体に対する、 フィールドの一覧表示を文字列化する処理です。
- 列挙型は、その定義時の記号名の文字列に変換されます。
- typedef で定義された型は Type(value) 形式で文字列化されます。
- Source型がTarget型に暗黙変換可能ならば、to は単に暗黙変換と同じ処理を実行します。
- bool値は "true" か "false" と表示されます。
- Sがワイド文字だった場合、 まずnarrow文字に変換したあと解析が行われます。
- Sがnarrow文字の場合は、通常の文字列解析が行われます。
- Sourceが非nullでTargetがnullの場合、 オブジェクトからオブジェクトへの変換は例外を発生します。
- SourceがオブジェクトでTargetがそうでない場合、変換は
Source オブジェクトの "to" メソッドを使います。
Example:
class Date { T to(T)() if(is(T == long)) { return timestamp; } ... } unittest { debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded."); auto d = new Date; auto ts = to!long(d); // d.to!long() と同じ }
- 数値型から数値型への定義域を狭める変換の場合、 値がTargetの範囲を超えていると例外が発生します。
- 配列から配列への変換(Targetが文字列型の場合を除く) は、to で再帰的に要素をひとつずつ変換します。
- 連想配列から連想配列への変換は、 キーと値をそれぞれひとつずつ再帰的にtoで変換します。
- 浮動小数点数から整数への丸め変換です。
Example:
assert(roundTo!(int)(3.14) == 3); assert(roundTo!(int)(3.49) == 3); assert(roundTo!(int)(3.5) == 4); assert(roundTo!(int)(3.999) == 4); assert(roundTo!(int)(-3.14) == -3); assert(roundTo!(int)(-3.49) == -3); assert(roundTo!(int)(-3.5) == -4); assert(roundTo!(int)(-3.999) == -4);
変換先が整数型でない場合は動作しません。 - parse 関数は
to とよく似た動作をします。違いは (1) 入力として文字列のみを受け取る
(2) 文字列を参照で受け取り、
変換で読み込んだ分先に進める (3) 全体を変換できなかったとしても例外を投げない、の3点です。
オーバーフローが起きたり、
1文字も読み取れなかった場合などは
依然として例外が発生します。
Example:
string test = "123 \t 76.14"; auto a = parse!(uint)(test); assert(a == 123); assert(test == " \t 76.14"); // パースした残り munch(test, " \t\n\r"); // ホワイトスペースをスキップ assert(test == "76.14"); auto b = parse!(double)(test); assert(b == 76.14); assert(test == "");
- 一文字文字列から読み込んで返し、 文字列は1つ先に進めます
- 配列を表した文字列を、左括弧 (デフォルトは '[') と右括弧 (デフォルトは ']') と区切り文字 (デフォルトでは ',') を指定して読み込みます。
- 小さな符号無し整数から文字列への変換です。
- 小さな符号つき整数から文字列への変換です。
- 符号無し整数 (uint と ulong).
- char, wchar, dchar から文字列型への変換です。
- 符号付き値 (int と long).
- C形式文字列
- float から任意の文字列型
- double から任意の文字列型
- real から任意の文字列型
- ifloat から任意の文字列型
- idouble から任意の文字列型
- ireal から任意の文字列型
- cfloat から任意の文字列型
- cdouble から任意の文字列型
- creal から任意の文字列型
- 値をradix進数表現で文字列に変換します。 radixは2から36までの値を指定できます。 valueはradixが10の時のみ符号付きの値として扱われます。 11~36進数表現では A から Z までの文字が使用されます。
- ポインタを size_t の値として文字列化します。
- 指定した任意の引数列を文字列に変換する、
便利な関数です。
Example:
assert(text(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"); assert(wtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"w); assert(dtext(42, ' ', 1.5, ": xyz") == "42 1.5: xyz"d);
- これらの関数は、
'0' で始まる8進リテラルは間違えやすいため、
ライブラリ関数で置き換えようという実験的な機能です。octal!177 あるいは octal!"177" は、現在の8進整数リテラル 0177 の代わりに使うことができ、
より視覚的にわかりやsくなります。この実装が普及すれば、
将来のバージョンの D 言語では8進整数リテラルは廃止されるかもしれません。
文字列の規則はリテラルの場合と同じです。
int に収まる値ならば int 型となり、それ以外では long 型になります。
ユーザーが接尾辞 L で long 型を強制すれば、
常に long になります。接尾辞 U または u があると、符号無し整数型になります。
整数から作った8進リテラルは、渡された整数の型を引き継ぎます。
Example:
// 0177 とおなじ auto x = octal!177; // octal はコンパイル時実行 enum y = octal!160; // unsigned octal auto z = octal!"1_000_000u";
- 渡された生メモリ領域 chunk のアドレスに非クラス型 T のオブジェクトを構築します。コンストラクタには引数
Args が渡ります。chunk は少なくとも T が必要とする以上のサイズが必要で、アラインメントは T のアラインメントの倍数となっていなければいけません。
この関数は対応するコンストラクタが @safe ならば
@trusted となれます。
Returns:
新規作成されたオブジェクトへのポインタ。 - 一つ上の emplace に似ていますが、
型 T の未初期化オブジェクトへのポインタを取る点が違います。
このオーバーロードは、例えば、T variable = void とした変数の初期化などに使えます。
Returns:
新規作成されたオブジェクトへのポインタ。 - 渡された生メモリ領域 chunk のアドレスにクラス型 T のオブジェクトを構築します。コンストラクタには引数
Args が渡ります。chunk は少なくとも T が必要とする以上のサイズが必要で、アラインメントは T のアラインメントの倍数となっていなければいけません。
(クラスインスタンスのサイズはThe size _traits(classInstanceSize, T) で得られます).
この関数は対応するコンストラクタが @safe ならば
@trusted となれます。
Returns:
新規作成されたオブジェクトへのポインタ。