【发布时间】:2016-12-07 08:48:33
【问题描述】:
我使用 scala f 字符串插值器如下:
def format(id: Int) = f"A$id%04d"
format(21) // A0021
但是,我希望能够一劳永逸地定义一个长度(在固定为 4 之前),并获得一个函数,它将用该长度格式化字符串。 所以,而不是拥有
def format(length: Int, id: Int) = ???
f(5, 21) // A00021
我想要这个:
def format(length: Int)(id: Int) = ???
val f = format(5)
f(21) // A00021
如何使用 scala f 插值器或其他方法实现此功能?
更新
我并不是在寻找这样一个在运行时涉及编译器的解决方案,但我很欣赏 som-snytt 的回答。根据他的回答,这里有一个可行的解决方案:
import scala.tools.reflect._,scala.reflect.runtime._,universe._
def defFormat(length: Int): Int => String = {
val code = raw"""(i: Int) => f"A$$i%0${length}d""""
tb.eval(tb.parse(code)).asInstanceOf[Int => String]
}
val format = defFormat(length = 5)
format(21)
【问题讨论】:
-
我认为这可能会对您有所帮助:stackoverflow.com/questions/13260864/…
标签: scala