有人应该提到你应该打开警告:
apm@mara:~$ skala -Ywarn-infer-any
Welcome to Scala version 2.11.0-20130524-174214-08a368770c (OpenJDK 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.
scala> "abc".padTo(10, "*").mkString
<console>:7: warning: a type was inferred to be `Any`; this may indicate a programming error.
val res0 =
^
res0: String = abc*******
请注意,这样做没有任何问题(本身)。
也许有一个用例:
scala> case class Ikon(c: Char) { override def toString = c.toString }
defined class Ikon
scala> List(Ikon('#'),Ikon('@'),Ikon('!')).padTo(10, "*").mkString
res1: String = #@!*******
或更好
scala> case class Result(i: Int) { override def toString = f"$i%03d" }
defined class Result
scala> List(Result(23),Result(666)).padTo(10, "---").mkString
res4: String = 023666------------------------
由于这不是您的用例,也许您应该询问是否要使用冗长且充满危险的 API。
这就是为什么丹尼尔的答案是正确的。我不确定为什么他的示例中的格式字符串看起来如此可怕,但它通常看起来更温和,因为在大多数可读字符串中,您只需要在几个地方格式化字符。
scala> val a,b,c = "xyz"
scala> f"$a is followed by `$b%10s` and $c%.1s remaining"
res6: String = xyz is followed by ` xyz` and x remaining
您需要添加虚假格式化程序的一种情况是您需要换行符:
scala> f"$a%s%n$b$c"
res8: String =
xyz
xyzxyz
我认为插值器应该处理 f"$a%n$b"。哦,等一下,它在 2.11 中已修复。
scala> f"$a%n$b" // old
<console>:10: error: illegal conversion character
f"$a%n$b"
scala> f"$a%n$b" // new
res9: String =
xyz
xyz
所以现在真的没有理由不进行插值。