I haven't tried the pattern matching side yet, but at the moment, I am disliking the extra parens required:
scala> val vs = 1 to 10
vs: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> val xs = vs zip vs
xs: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), (9,9), (10,10))
scala> vs map (s"How many? $_")
res9: scala.collection.immutable.IndexedSeq[String] = Vector(How many? 1, How many? 2, How many? 3, How many? 4, How many? 5, How many? 6, How many? 7, How many? 8, How many? 9, How many? 10)
scala> xs map (s"How many? $_ by $_").tupled
res10: scala.collection.immutable.IndexedSeq[String] = Vector(How many? 1 by 1, How many? 2 by 2, How many? 3 by 3, How many? 4 by 4, How many? 5 by 5, How many? 6 by 6, How many? 7 by 7, How many? 8 by 8, How many? 9 by 9, How many? 10 by 10)
By contrast:
scala> vs map s"How many? $_"
res15: Any => scala.collection.immutable.IndexedSeq[Char] = <function1>
scala> xs map s"How many? $_ by $_".tupled
<console>:10: error: value tupled is not a member of String
xs map s"How many? $_ by $_".tupled
^
and while this is great
scala> val foo = "hi"
foo: String = hi
scala> s"($foo)+".r
res13: scala.util.matching.Regex = (hi)+
this is less so
scala> s"How many? $_ by $_ by $_".r
res14: (Any, Any, Any) => scala.util.matching.Regex = <function3>
That is, I'd prefer s"$_".tupled worked and s"$_".r did not.
Similarly,
scala> s"How many? $_ by $_ by $_"("one","two","three")
<console>:8: error: too many arguments for method apply: (index: Int)Char in class StringOps
s"How many? $_ by $_ by $_"("one","two","three")
^
scala> (s"How many? $_ by $_ by $_")("one","two","three")
res20: String = How many? one by two by three