Scala Language
문자열 보간법
수색…
비고
이 기능은 Scala 2.10.0 이상 버전에서 제공됩니다.
Hello 문자열 보간
s 보간은 문자열 내의 변수 사용을 허용합니다.
val name = "Brian"
println(s"Hello $name")
도망쳤을 때 "Hello Brian"을 콘솔에 출력합니다.
f 인터폴 레이터를 사용하여 형식화 된 문자열 보간
val num = 42d
f를 사용하여 num
대해 두 자리 소수점 인쇄
println(f"$num%2.2f")
42.00
e를 사용하여 과학 표기법을 사용하여 num
인쇄
println(f"$num%e")
4.200000e+01
인쇄 num
A를 16 진수로
println(f"$num%a")
0x1.5p5
다른 형식 문자열은 https://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#detail 에서 찾을 수 있습니다.
문자열 리터럴에서 표현식 사용
중괄호를 사용하여 표현식을 문자열 리터럴로 보간 할 수 있습니다.
def f(x: String) = x + x
val a = "A"
s"${a}" // "A"
s"${f(a)}" // "AA"
중괄호가 없으면 스칼라는 $
(이 경우 f
) 뒤에 식별자 만 보간합니다. f
에서 String
으로의 암시 적 변환이 f
예제에서는 예외입니다.
s"$f(a)" // compile-time error (missing argument list for method f)
사용자 정의 문자열 보간 자
내장 문자열 인터폴 레이터 외에도 사용자 정의 문자열 인터폴 레이터를 정의 할 수 있습니다.
my"foo${bar}baz"
컴파일러에 의해 확장됩니다.
new scala.StringContext("foo", "baz").my(bar)
scala.StringContext
에는 my
메서드가 없으므로 암시 적 변환을 통해 제공 할 수 있습니다. 내장과 같은 동작과 사용자 정의 보간 s
다음과 같이 보간은 구현 될 것입니다 :
implicit class MyInterpolator(sc: StringContext) {
def my(subs: Any*): String = {
val pit = sc.parts.iterator
val sit = subs.iterator
// Note parts.length == subs.length + 1
val sb = new java.lang.StringBuilder(pit.next())
while(sit.hasNext) {
sb.append(sit.next().toString)
sb.append(pit.next())
}
sb.toString
}
}
my"foo${bar}baz"
보간법 인 my"foo${bar}baz"
는 다음과 같이 쓸모가 있습니다.
new MyInterpolation(new StringContext("foo", "baz")).my(bar)
보간 함수의 인자 나 리턴 타입에는 제한이 없다. 이는 다음 예제와 같이 보간 구문을 창의적으로 임의의 객체를 구성하는 데 사용할 수있는 어두운 경로를 안내합니다.
case class Let(name: Char, value: Int)
implicit class LetInterpolator(sc: StringContext) {
def let(value: Int): Let = Let(sc.parts(0).charAt(0), value)
}
let"a=${4}" // Let(a, 4)
let"b=${"foo"}" // error: type mismatch
let"c=" // error: not enough arguments for method let: (value: Int)Let
추출기로서의 문자열 보간 기
Scala의 문자열 보간 기능을 사용하여 스칼라 매크로의 quasiquotes API 에서 가장 많이 사용되는 정교한 추출기 (패턴 매처)를 만들 수도 있습니다.
n"p0${i0}p1"
이 new StringContext("p0", "p1").n(i0)
주어지면 new StringContext("p0", "p1").n(i0)
추출기 기능은 StringContext
에서 클래스로의 암시 적 변환을 제공함으로써 가능할 수 있습니다. unapply
또는 unapplySeq
메소드를 정의하는 유형의 n
특성.
예를 들어, StringContext
부분에서 정규 표현식을 구성하여 경로 세그먼트를 추출하는 다음 추출기를 생각해보십시오. 그런 다음 대부분의 heavy 리프팅을 결과 scala.util.matching.Regex가 제공하는 unapplySeq
메소드로 위임 할 수 있습니다.
implicit class PathExtractor(sc: StringContext) {
object path {
def unapplySeq(str: String): Option[Seq[String]] =
sc.parts.map(Regex.quote).mkString("^", "([^/]+)", "$").r.unapplySeq(str)
}
}
"/documentation/scala/1629/string-interpolation" match {
case path"/documentation/${topic}/${id}/${_}" => println(s"$topic, $id")
case _ => ???
}
path
객체는 정규 인터폴 레이터로도 동작하기 위해 apply
메소드를 정의 할 수 있습니다.
원시 문자열 보간
문자열을 그대로 출력하고 리터럴을 이스케이프하지 않으려면 원시 인터폴 레이터를 사용할 수 있습니다.
println(raw"Hello World In English And French\nEnglish:\tHello World\nFrench:\t\tBonjour Le Monde")
원시 인터폴 레이터를 사용하면 콘솔에 다음과 같은 내용이 표시됩니다.
Hello World In English And French\nEnglish:\tHello World\nFrench:\t\tBonjour Le Monde
원시 인터폴 레이터가 없으면 \n
및 \t
가 이스케이프되었습니다.
println("Hello World In English And French\nEnglish:\tHello World\nFrench:\t\tBonjour Le Monde")
인쇄물:
Hello World In English And French
English: Hello World
French: Bonjour Le Monde