string の導入
なるほどなぁ!
色々いじってて感じたのは,これからは char じゃなくて string を使えという意思.
後で見直すために書いておこう.
(あ,いや,えらい人には当たり前のことかもしれないです(^^;;;)
テンプレートに値パラメータとして文字列リテラルを渡すとき,パラメータの型は文字列リテラルの型である invarint(char) になる.
ここでテンプレート側を template f(char s) と書いてしまうと,マッチするテンプレートがないとコンパイラに怒られる.
invarint(char) から const(char) への暗黙の変換は許されているから,テンプレート側を template f(string s) にすると素直だ.
string は const(char) のエイリアスだから.
//template f(char[] s) // error, "hello" is const(char)[] or invariant(char)[] template f(string s) { const f = s ~ " world!"; } void main() { string s = f!("hello"); // invariant(char)[] to const(char)[] writefln(s); }
また,一度作った文字列を安易に変更できなくなったことで,文字の配列というイメージがあまりなくなった.
文字列は文字列というオブジェクトという感じ.
例えば,下の "hello world?", "Hello World?" という文字の並びを変更することはできない.
そういうときは,例えば, c みたいな別の変数を作ってそこに文字列を作り直す必要がある.
void main() { string a = "hello world?"; a = "Hello World?"; // ok // a.length -= 1; // error, 'a.length' is not an lvalue string c = a[0..$-1] ~ "!"; // ok, 'a' substring can read writefln(c); }