Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Cadeias de caracteres interpoladas são cadeias de caracteres que permitem inserir expressões F# nelas. Eles são úteis em uma ampla variedade de cenários em que o valor de uma cadeia de caracteres pode ser alterado com base no resultado de um valor ou expressão.
Sintaxe
$"string-text {expr}"
$"string-text %format-specifier{expr}"
$@"string-text {expr}"
@$"string-text {expr}"
$"""string-text {"embedded string literal"}"""
$$"""string-text %%format-specifier{{expr}}"""
Observações
Cadeias de caracteres interpoladas permitem que você escreva código em "buracos" dentro de um literal de cadeia de caracteres. Aqui está um exemplo básico:
let name = "Phillip"
let age = 30
printfn $"Name: {name}, Age: {age}"
printfn $"I think {3.0 + 0.14} is close to {System.Math.PI}!"
O conteúdo entre cada {} par de chaves pode ser qualquer expressão F#.
Para cadeias de caracteres interpoladas não tipadas (sem especificadores de formato), a expressão é convertida em uma cadeia de caracteres usando o ToString() método. Se a expressão for avaliada como null, uma cadeia de caracteres vazia será usada.
Para cadeias de caracteres interpoladas digitadas com especificadores de formato (como %s{expr} ou %d{expr}), a conversão segue as regras definidas para esse especificador de formato específico.
Para escapar de um {} par de chaves, escreva duas delas da seguinte maneira:
let str = $"A pair of braces: {{}}"
// "A pair of braces: {}"
Cadeias de caracteres interpoladas tipadas
Cadeias de caracteres interpoladas também podem ter especificadores de formato F# para impor a segurança do tipo.
let name = "Phillip"
let age = 30
printfn $"Name: %s{name}, Age: %d{age}"
// Error: type mismatch
printfn $"Name: %s{age}, Age: %d{name}"
No exemplo anterior, o código passa erroneamente o age valor onde name deveria estar e vice/versa. Como as cadeias de caracteres interpoladas usam especificadores de formato, esse é um erro de compilação em vez de um bug de runtime sutil.
Cadeias de caracteres interpoladas verbatim
O F# dá suporte a cadeias de caracteres interpoladas verbatim de duas maneiras:
Usando $@ ou @$ prefixo
Você pode combinar o prefixo $ de interpolação com o prefixo @ de cadeia de caracteres verbatim em qualquer ordem. As cadeias de caracteres verbatim ignoram sequências de escape (exceto para "" representar uma aspa) e podem abranger várias linhas. Isso é especialmente útil ao trabalhar com caminhos de arquivo ou cadeias de caracteres que contêm barras invertidas e aspas.
let name = "Alice"
let path = @"C:\Users\Alice\Documents"
// Using $@ prefix
printfn $@"User {name} has files in: {path}"
// Using @$ prefix (also valid)
printfn @$"User {name} has files in: {path}"
// Embedding quotes - use "" to represent a single "
let message = $@"He said ""{name}"" is here"
Usando aspas triplas
O F# também dá suporte a cadeias de caracteres interpoladas verbatim com aspas triplas para que você possa inserir literais de cadeia de caracteres sem escapar.
let age = 30
printfn $"""Name: {"Phillip"}, Age: %d{age}"""
Especificadores de formato
Os especificadores de formato podem ser estilo printf ou . Estilo NET. Os especificadores de estilo printf são aqueles cobertos por formatação de texto sem formatação, colocados antes das chaves. Por exemplo:
let pi = $"%0.3f{System.Math.PI}" // "3.142"
let code = $"0x%08x{43962}" // "0x0000abba"
O especificador %A de formato é particularmente útil para produzir a saída de diagnóstico de dados F# estruturados.
let data = [0..4]
let output = $"The data is %A{data}" // "The data is [0; 1; 2; 3; 4]"
. Os especificadores de estilo NET são aqueles utilizáveis com String.Format, colocados após um : dentro das chaves. Por exemplo:
let pi = $"{System.Math.PI:N4}" // "3.1416"
let now = $"{System.DateTime.UtcNow:``yyyyMMdd``}" // for example, "20220210"
Se um . O especificador de estilo NET contém um caractere incomum e, em seguida, pode ser escapado usando backticks duplos:
let nowDashes = $"{System.DateTime.UtcNow:``yyyy-MM-dd``}" // for example, "2022-02-10"
Alinhar expressões em cadeias de caracteres interpoladas
Você pode alinhar à esquerda ou alinhar expressões à direita dentro de cadeias de caracteres | interpoladas e uma especificação de quantos espaços. A cadeia de caracteres interpolada a seguir alinha as expressões esquerda e direita à esquerda e à direita, respectivamente, por sete espaços.
printfn $"""|{"Left",-7}|{"Right",7}|"""
// |Left | Right|
Cadeias de caracteres interpoladas e FormattableString formatação
Você também pode aplicar a formatação que adere às regras para 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."
Além disso, uma cadeia de caracteres interpolada também pode ser marcada como um FormattableString tipo de anotação:
let frmtStr = $"The speed of light is {speedOfLight:N3} km/s." : FormattableString
// Type: FormattableString
// The speed of light is 299,792.458 km/s.
Observe que a anotação de tipo deve estar na própria expressão de cadeia de caracteres interpolada. F# não converte implicitamente uma cadeia de caracteres interpolada em um FormattableString.
Sintaxe estendida para interpolação de cadeia de caracteres
A partir do F# 8, quando você trabalha com texto contendo vários caracteres ou { vários }% caracteres, você pode usar a sintaxe de interpolação de cadeia de caracteres estendida para remover a necessidade de escape.
Literais de cadeia de caracteres de aspas triplas podem começar com vários $ caracteres, o que altera quantas chaves são necessárias para abrir e fechar a interpolação.
Nesses literais de cadeia de caracteres, { e } os caracteres não precisam ser escapados:
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."""
O número de % caracteres necessários para especificadores de formato é afetado da mesma forma:
let percent = $$"""50% of 20 is %%.1f{{20m * 0.5m}}"""
// "50% of 20 is 10.0"