挿入文字列

補間された文字列は、F# の式を埋め込むことができる文字列です。 これは、値または式の結果に基づいて文字列の値が変わる可能性があるさまざまなシナリオで役立ちます。

構文

$"string-text {expr}"
$"string-text %format-specifier{expr}"
$"""string-text {"embedded string literal"}"""
$$"""string-text %%format-specifier{{expr}}"""

解説

補間された文字列を使用すると、文字列リテラル内の "穴" にコードを記述できます。 基本的な例を次に示します。

let name = "Phillip"
let age = 30
printfn $"Name: {name}, Age: {age}"

printfn $"I think {3.0 + 0.14} is close to {System.Math.PI}!"

{} 中かっこのペアで囲まれたコンテンツに、任意の F# 式を指定できます。

{} 中かっこのペアをエスケープするには、次のように 2 つのペアを記述します。

let str = $"A pair of braces: {{}}"
// "A pair of braces: {}"

型指定のある補間された文字列

補間された文字列に F# の書式指定子を使用して、タイプ セーフを適用することもできます。

let name = "Phillip"
let age = 30

printfn $"Name: %s{name}, Age: %d{age}"

// Error: type mismatch
printfn $"Name: %s{age}, Age: %d{name}"

上の例では、コードは name を渡す必要がある場所で誤って age 値を渡します (その逆も同様です)。 この補間された文字列では書式指定子が使用されているので、これは些細な実行時のバグではなくコンパイル エラーとなります。

逐語的な補間された文字列

F# では、文字列リテラルを埋め込むことができるように、三重引用符を使用した逐語的な補間された文字列がサポートされています。

let age = 30

printfn $"""Name: {"Phillip"}, Age: %d{age}"""

書式指定子

書式指定子には、printf スタイルまたは .NET スタイルを指定できます。 Printf スタイルの指定子は、中かっこの前に配置されたプレーンテキストの書式設定でカバーされています。 次に例を示します。

let pi = $"%0.3f{System.Math.PI}"  // "3.142"
let code = $"0x%08x{43962}"  // "0x0000abba"

書式指定子 %A は、構造化された F# データの診断出力を生成する場合に特に便利です。

let data = [0..4]
let output = $"The data is %A{data}"  // "The data is [0; 1; 2; 3; 4]"

.NET スタイルの指定子は、中かっこ内で : の後に配置された String.Format で使用できます。 次に例を示します。

let pi = $"{System.Math.PI:N4}"  // "3.1416"
let now = $"{System.DateTime.UtcNow:``yyyyMMdd``}" // e.g. "20220210"

.NET スタイルの指定子に特殊な文字が含まれている場合は、二重バッククォートを使用してエスケープできます。

let nowDashes = $"{System.DateTime.UtcNow:``yyyy-MM-dd``}" // e.g. "2022-02-10"

補間された文字列内での式の配置

| を使用し、スペースの数を指定することで、補間された文字列内で式を左揃えまたは右揃えにできます。 次の補間された文字列では、それぞれスペース 7 つを使用して、式を左揃えおよび右揃えにします。

printfn $"""|{"Left",-7}|{"Right",7}|"""
// |Left   |  Right|

補間された文字列と FormattableString 書式指定

FormattableString の規則に従う書式指定を適用することもできます。

let speedOfLight = 299792.458
printfn $"The speed of light is {speedOfLight:N3} km/s."
// "The speed of light is 299,792.458 km/s."

さらに、型の注釈によって、補間された文字列を FormattableString として型チェックできます。

let frmtStr = $"The speed of light is {speedOfLight:N3} km/s." : FormattableString
// Type: FormattableString
// The speed of light is 299,792.458 km/s.

型の注釈は、補間された文字列式自体に対して指定する必要があります。 F# では、補間された文字列は暗黙的に FormattableString に変換されません。

文字列補間の拡張構文

F# 8 以降、複数の {} または % 文字が既に含まれたテキストを操作する場合には、拡張文字列補間構文を使用してエスケープの必要性をなくすことができます。

三重引用符文字列リテラルは複数の $ 文字で開始できます。これにより、補間を開いたり閉じたりするのに必要な中かっこの数が変わります。 これらの文字列リテラルでは、{ および } 文字をエスケープする必要はありません。

let str = $$"""A string containing some {curly braces} and an {{"F#" + " " + "expression"}}."""
// "A string containing some {curly braces} and an F# expression."
let another = $$$"""A string with pairs of {{ and }} characters and {{{ "an F# expression" }}}."""
// "A string with pairs of {{ and }} characters and an F# expression."""

書式指定子に必要な % 文字の数は、同じように影響を受けます。

let percent = $$"""50% of 20 is %%.1f{{20m * 0.5m}}"""
// "50% of 20 is 10.0"

関連項目