I saw the following image on this Twitter page:

and immediately became curious, “How can I create something like that Ruby %Q function in Scala, but where each line becomes a string in a list, i.e., a Seq[String]?”
A “Q” interpolator
Thanks to the help of Karsten — see the Comments section below — we can do something very similar in Scala. With his solution we can write code like this:
val list = Q"""
http://angel.co/mile-high-organics
http://angel.co/kindara
http://angel.co/precog
http://angel.co/pivotdesk
"""
His terrific solution was a combination of my “First attempt at a solution” shown below, and Scala’s string interpolation syntax.
The solution
Cutting right to the chase, his solution looks like this:
implicit class QHelper(val sc : StringContext) {
def Q(args : Any*): Seq[String] = {
val strings = sc.parts.iterator
val expressions = args.iterator
var buf = new StringBuffer(strings.next)
while(strings.hasNext) {
buf append expressions.next
buf append strings.next
}
buf.toString.split("\n")
.toSeq
.map(_.trim)
.filter(_ != "")
}
}
My first attempt at a solution (the original/old code)
In my first attempt at a solution I couldn’t think of how to solve the problem without making the list of URLs a multiline string, so I ended up creating a Scala object with an apply method that converts a multiline string to a sequence:
object Q {
def apply(s: String): Seq[String] =
s.split("\n")
.toSeq
.map(_.trim)
.filter(_ != "")
}
Technically, that code converts a multiline String to a Seq[String].
I then tested that Q object with this little driver program:
object MultilineStringToList extends App {
val list = Q("""
http://angel.co/mile-high-organics
http://angel.co/kindara
http://angel.co/precog
http://angel.co/pivotdesk
""")
list.foreach(println)
}
which printed out this:
http://angel.co/mile-high-organics http://angel.co/kindara http://angel.co/precog http://angel.co/pivotdesk
That’s not quite as pretty as the Ruby code, but it’s close. IMHO, it’s also easier to read and type than this:
val list = List(
"http://angel.co/mile-high-organics",
"http://angel.co/kindara",
"http://angel.co/precog",
"http://angel.co/pivotdesk"
)
Summary
In summary, if you wanted to see how to convert a multiline string to a list/sequence in Scala, or otherwise wanted a Q class/function like this, I hope this is helpful. And again, thanks to Karsten for greatly improving my original code.

