您可以为 f-interpolator 提供隐式:
scala> case class A(i: Int)
defined class A
scala> implicit def atoi(a: A): Int = a.i
warning: there were 1 feature warning(s); re-run with -feature for details
atoi: (a: A)Int
scala> f"${A(42)}%02d"
res5: String = 42
另请参阅Travis Brown在提取中使用正则表达式组名称的示例和解决方案。我花了大约一分钟的时间来窃取这个好主意。
"a123bc" match {
case res @ xr"(?<c>a)(?<n>\d+)(?<s>bc)" => assert {
res.c == 'a' && res.n == 123 && res.s == "bc"
}
}
作为记录,在作曲方面,我想:
val a = A(Rick, 42)
val greeter = f"Hi! My name is $_. I am ${_}%d years old"
greeter(a, a)
但对于可怜的下划线来说,这被认为太过分了。您必须像其他答案一样编写函数。
您的宏在其中查看"${a[Int]}"
并编写带有Int
参数的函数的表单看起来并不难实现。
f-interpolator 的其他功能包括其他静态错误检查:
scala> f"$b%.02d"
<console>:19: error: precision not allowed
f"$b%.02d"
^
并支持Formattable
:
scala> val ff = new Formattable { def formatTo(fmtr: Formatter, flags: Int, width: Int, precision: Int) = fmtr.format("%s","hello, world") }
ff: java.util.Formattable = $anon$1@d2e6b0b
scala> f"$ff"
res6: String = hello, world
一个快速宏可能会发出(i: Int) => f"${ new Formattable {...} }"
.