보간된 문자열은 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# 식일 수 있습니다.
F# 11에서 문자열 반환 보간의 경우 형식이 지정되지 않은 식은 F#의 string 변환을 사용합니다. 식이 계산 null되면 빈 문자열이 사용됩니다. 이전 컴파일러는 일부 문자열 전용 보간을 최적화할 수 있었지만 그렇지 않으면 printf 서식을 사용했습니다. 서식 차이는 네이티브 AOT 및 문자열 반환 보간 을 참조하세요.
형식 지정자(예: %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}"
이전 예제에서 코드는 위치 값을 잘못 전달 agename 하고 그 반대의 경우도 마찬가지입니다. 보간된 문자열은 형식 지정자를 사용하므로 미묘한 런타임 버그 대신 컴파일 오류입니다.
보간된 축자 문자열
F#은 다음과 같은 두 가지 방법으로 축자 보간 문자열을 지원합니다.
사용 $@ 또는 @$ 접두사
보간 접두사를 $ 축자 문자열 접두 @ 사와 순서에 따라 결합할 수 있습니다. 축자 문자열은 이스케이프 시퀀스를 무시하고(따옴표를 나타내는 경우 제외 "" ) 여러 줄에 걸쳐 있습니다. 이는 백슬래시 및 따옴표를 포함하는 파일 경로 또는 문자열을 사용할 때 특히 유용합니다.
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"
보간된 문자열에서 식 정렬
보간된 문자열 | 내에서 식을 왼쪽 맞춤 또는 오른쪽 맞춤하고 공백 수를 지정할 수 있습니다. 다음 보간된 문자열은 왼쪽 및 오른쪽 식을 각각 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"
네이티브 AOT 및 문자열 반환 보간
리플렉션 기반 서식 엔진 없이 텍스트의 서식을 지정하려면 일반 또는 .NET 형식 구멍이 있는 문자열 반환 보간을 사용합니다.
let name = "Ada"
let score = 97.5
let message: string = $"{name}: {score:F1}"
printn message
// Ada: 97.5
F# 11에서는 직접 변환 및 System.String.Concat 더 많은 문자열 반환 보간을 사용합니다. .NET 형식 구멍은 고정 String.Format 을 사용하고 해당 인수를 상자에 넣습니다. 이러한 컴파일러 변경 내용은 최신 Core 빌드를 요구하지 않고 네이티브 AOT 를 지원합니다. 다른 애플리케이션 코드는 여전히 리플렉션이 필요할 수 있습니다.
인쇄물 서식(예: %04d{number} 또는 %A{record})이 필요한 Printf 스타일 구멍은 리플렉션 기반 경로를 계속 사용할 수 있습니다. Bare%s, %c, , %i%d및 %M holes은 형식 검사를 유지하고 인쇄 형식 지정을 방지합니다. 다른 지정자(포함 %u)는 해당 최적화에서 다루지 않습니다. 값으로 PrintfFormat 사용되는 보간은 결과 형식 string인 보간과도 다릅니다.
문화권 및 형식 호환성
일반 구멍은 F#의 변환을 string 사용합니다. .NET 형식 구멍은 고정 서식을 사용합니다. 지역화된 출력을 생성하려면 문화권을 명시적으로 선택합니다.
open System.Globalization
let value = 12.5m
let machineText: string = $"{value:F2}"
let displayText =
value.ToString("F2", CultureInfo.GetCultureInfo("fr-FR"))
assert (machineText = "12.50")
assert (displayText = "12,50")
업그레이드할 때 지역화된 출력을 확인합니다.
FormattableString 는 이 연결 경로를 따르는 대신 이후 공급자 기반 형식 지정에 대한 인수를 유지합니다.
경고 FS3884는 보간 구멍에서 적용되지 않은 함수 또는 대리자를 식별합니다. 결과를 의도한 경우 함수를 적용합니다.
let weight () = 12.5m
let text: string = $"Weight: {weight ()} kg"
표준 출력에 값 쓰기
printf 형식 없이 값을 작성하려면 FSharp.Core 11을 추가하고 printprintn. 변환 printn 을 사용하고 string 줄 바꿈을 추가합니다.
print "Parcels: "
printn 3
구조적 %A 출력의 경우 일반 텍스트 서식을 사용합니다.
리플렉션 없이 레코드 및 공용 구조체 출력
F# 11에서는 --reflectionfree형식 이름만 표시하는 대신 레코드 및 공용 구조체에 대한 의미 있는 ToString 구현을 생성할 수 있습니다.
type Reading = { Sensor: string; Value: int }
type Outcome = Recorded of Reading | Unavailable
let reading = { Sensor = "north"; Value = 12 }
printn reading
printn (Recorded reading)
샘플 프로젝트에서 플래그를 사용하도록 설정합니다. 출력은 %A서로 다릅니다. 필드 형식에도 적절한 ToString 구현이 필요합니다.
참고하십시오
.NET