コード
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
3行目でコンパイルに失敗します。なんで?どのようなエレガントな選択肢がありますか?
エラー出力はError: cannot append type const(char)* to type string
です。
コード
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
3行目でコンパイルに失敗します。なんで?どのようなエレガントな選択肢がありますか?
エラー出力はError: cannot append type const(char)* to type string
です。
使用しないでくださいconst(char)*
?
string bar = "Hello ";
string foo = "world!";
bar ~= foo;
Dの文字列リテラルはタイプです。Cコードとインターフェイスする場合を除いて、string
を使用する必要はありません。const(char)*
Dがその連結を許可しない理由const(char)*
は、単語のいかなる意味においても、が文字列ではないためです。Dの文字列はimmutable(char)[]
(alias
'd by string
)です。Aconst(char)*
は定数文字への単なるポインタです。CやC++とは異なり、暗黙のnullターミネータがないため、Dはヌルターミネータがあると想定できません。
何らかの理由で絶対にaconst(char)*
を使用する必要があり、それがnullで終了していることがわかっている場合は、スライスしてそれを作成し、それを:const(char)[]
に追加できます。string
string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0..strlen(foo)];
string
immutable(char)[]
は、つまり、不変文字の可変スライスのエイリアスです。bar
コードには、このタイプの配列スライスが含まれています。
Dのと文字列リテラルの関係はconst(char)*
、文字列リテラルが常にnullで終了し、immutable(char)[]
(つまりstring
)として、またはimmutable(char)*
Cコードとの便利な相互運用性のために入力されるということです。後者は暗黙的にに変換可能const(char)*
です。これは文字列リテラルの場合のみであることに注意することが重要です。一般的な場合、配列は必ずしもnullで終了するわけではなく、同等のポインタに暗黙的に変換できません(ただし、.ptr
スライスのメンバーT[]
は型T*
であり、最初のスライスを指します)スライスの要素)。
連結演算子は、配列や、関連する演算子のオーバーロードを伴うユーザー定義型などを処理します。Dは組み込み型の演算子のオーバーロードを許可しないため、それらをポインターで機能させることはできません。
解決策は、配列とポインターで同様に機能するスライス演算子を使用して、ポインターが指す文字列のスライスを作成することです。
import core.stdc.string : strlen;
string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0 .. strlen(foo)];
上記では、式foo[0 .. strlen(foo)]
はタイプであり、タイプ(ie )であるconst(char)[]
と連結することができます。bar
immutable(char)[]
string