String interpolationによるextractor
Processed string literalの展開
foo"t0${x1}t1 ... ${xn}tn"
は、
new StringContext("t0", "t1", ... , "tn").foo(x1, ..., xn)
のように展開される・・・のだが、これが有効な式でさえあればよいらしく、 extractorも返せてしまうようだ。*1
例
implicit class Plus(sc: StringContext) { object plus { def apply(x: Int, y: Int): Int = x + y def unapply(z: Int): Option[(Int, Int)] = Some((1, z-1)) } } def testMe() { val (x, y) = (1, 2) assertEquals(3, plus"$x$y") val plus"$v$w" = 3 assertEquals((1, 2), (v, w)) }
参考文献
- 文字列の補間 - Scala Documentation
- SIP-11 - String Interpolation - Scala Documentation
- Hootenanny Las: Pattern Matching with String Interpolation
- Google グループ
- regex - Regular expression and pattern matching in Scala - Stack Overflow
- [SI-7496] Add r method to StringContext (for regexes) - Scala
*1:ただし、undocumented