s String Interpolator
val w = "World"
println(s"Hello $w") // Hello World
문자열앞에 s를 붙혀서 사용하고 $변수명으로 변수의 내용을 참조할 수 있다.
println(s"1 +1 = ${1 + 1}") // 1 +1 = 2
그리고 위와 같이 ${}로 표현식 자체를 문자열 내에서 사용할 수도 있다.
f String Interpolator
val w = "world"
val n = 2
println(f"Hello $w%s $n%d") // Hello world 2
f는 s와 동일하게 문자열 앞에 사용하고 변수명뒤에 다른 언어의 print문처럼 변수의 타입을 지정할 수 있다. 변수를 해당 타입으로 변환하는데 이 때 변환은 자바의 Fomatter를 사용한다. f를 사용할 때는 타입세이프하므로 타입이 맞지 않으면 오류가 발생하고 변수명뒤에 %를 지정하지 않으면 %s(문자열)로 간주한다.
raw String Interpolator
raw는 s와 동일하지만 문자열을 이스케이프 하지 않는다.
scala> s"a\nb"
res0: String =
a
b
scala> raw"a\nb"
res1: String = a\nb
String Interpolator 만들기
필요한 기능을 직접 String Interpolator로 만들 수도 있다. 기능적으로는 쓸모없지만 다음 예제를 보자.
implicit class ExHelper(val sc: StringContext) {
def bracket(args: Any*) = {
val strings = sc.parts.iterator
val expressions = args.iterator
val result = new StringBuilder(strings.next)
while(strings.hasNext) {
result append "[" + expressions.next + "]"
result append strings.next
}
result
}
}
val name = "Outsider"
println(bracket"hello $name!!") // hello [Outsider]!!
bracket이라는 String Interpolator를 만들어서 변수에 대괄호를 자동으로 씌워주도록 만든 예제이다. 여기서 bracket"hello $name"라고 작성한 코드는 실제로는 다음과 같이 변환이 된다.
//bracket"hello $name"
new StringContext("hello ", "!!").bracket(name)
bracket을 실제 메서드 호출로 사용하게 되는데 여기서 bracket을 implicit으로 만들었으므로 이 코드는 다시 다음과 같이 변환된다.
//bracket"hello $name"
//new StringContext("hello ", "!!").bracket(name)
new ExHelper(new StringContext("hello ", "!!")).bracket(name)
위의 변환과정에서 보듯이 String Interpolator로 사용한 문자열은 StringContext의 parts로 전달되고 문자열내에서 사용한 표현식은 String Interpolator 메서드(여기서는 bracket)의 인자로 전달된다. String Interpolation 문서에 나온대로 문자열을 받아서 JSON 객체로 변환해서 리턴하는 것도 가능하다. 현재 String Interpolator는 패턴매칭에서는 사용할 수 없다.(2.11에서 지원 예정)
Comments