Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Интерполированные строки — это строки , которые позволяют внедрять в них выражения 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"