수색…


비고

이 기능은 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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow