...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

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);
}