String Interpolation

in Scala 2.10

By Brad Fritz / @bfritz

String What?


val lang = "Scala"
println(s"I like $lang")
          

I like Scala
          

What about typos?


s"I like $lagn"
            

<console>:8: error: not found: value lagn
              s"I like $lagn"
                        ^
            

Like Formatting?


val sum = 2.0
f"1.0 + 1.0 = $sum%1.1f"
          

1.0 + 1.0 = 2.0
          

Is it type-safe?


val sum = 2.0
f"1.0 + 1.0 = $sum%1d"
            

<console>:9: error: type mismatch;
 found   : Double
 required: Int
              f"1.0 + 1.0 = $sum%1d"
                             ^
            

Build Your Own:


implicit class Base64String(val sc: StringContext)
  extends AnyVal {

  def b64(args: String*): String = {
    // secret sauce:
    //   transform args and context into
    //   new string
  }
}
          

val msg = "secret"
b64"base64(secret): $msg"
// calls new StringContext("base64(secret): ").b64(msg)
          

base64(secret): c2VjcmV0
          

Secret Sauce:


import com.google.common.base.Charsets.US_ASCII
import com.google.common.io.BaseEncoding.base64

// Based on Scala's StringContext class:
// https://github.com/scala/scala/blob/v2.10.0/src/library/scala/StringContext.scala
implicit class Base64String(val sc: StringContext) extends AnyVal {
  def b64(args: String*): String = {

    if (sc.parts.length != args.length + 1)
      throw new IllegalArgumentException(
      "wrong number of arguments for b64 interpolated string")

    val strings = sc.parts.iterator
    val expressions = args.iterator
    val bldr = new java.lang.StringBuilder(strings.next)
    while (expressions.hasNext) {
      bldr append strings.next
      bldr append base64().encode(expressions.next.getBytes(US_ASCII))
    }
    bldr.toString
  }
}
          
## From the Horse's Mouth: * [Overview by Josh Suereth](http://docs.scala-lang.org/overviews/core/string-interpolation.html)
(source for most of this presentation) * [SIP-11 Description](http://docs.scala-lang.org/sips/pending/string-interpolation.html) * [StringContext Scaladoc](http://www.scala-lang.org/api/current/index.html#scala.StringContext)