Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Интерполированные строки — это строки , которые позволяют внедрять в них выражения F#. Они полезны в широком спектре сценариев, когда значение строки может измениться на основе результата значения или выражения.
Синтаксис
$"string-text {expr}"
$"string-text %format-specifier{expr}"
$@"string-text {expr}"
@$"string-text {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#.
Для нетипизированных интерполированных строк (без описателей формата) выражение преобразуется в строку с помощью ToString() метода. Если выражение оценивается null, используется пустая строка.
Для типизированных интерполированных строк с описателями формата (например %s{expr} , или %d{expr}) преобразование следует правилам, определенным для этого конкретного описателя формата.
Чтобы избежать {} пары фигурных скобок, напишите два из них так:
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}"
В предыдущем примере код ошибочно передает age значение, где name должно быть, и наоборот. Так как интерполированные строки используют описатели формата, это ошибка компиляции вместо тонкой ошибки среды выполнения.
Подробные интерполированные строки
F# поддерживает интерполированные строки подробной версии двумя способами:
Использование $@ или @$ префикс
Префикс $ интерполяции можно объединить с префиксом @ строки verbatim в любом порядке. Подробные строки игнорируют escape-последовательности (за исключением "" представления кавычки) и могут охватывать несколько строк. Это особенно полезно при работе с путями к файлам или строками, содержащими обратные косые и кавычки.
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"
Использование тройных кавычек
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``}" // for example, "20220210"
Если . Описатель стилей NET содержит необычный символ, поэтому его можно экранировать с помощью двойных обратных символов:
let nowDashes = $"{System.DateTime.UtcNow:``yyyy-MM-dd``}" // for example, "2022-02-10"
Выравнивание выражений в интерполированных строках
Вы можете выровнять или выровнять выражения вправо внутри интерполированных строк и | указать, сколько пробелов. Следующая интерполированная строка выравнивает левое и правое выражения слева и справа соответственно на семь пробелов.
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"