有人应该提到,您应该打开警告:
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`
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。
这就是为什么Daniel的回答是正确的。我不确定他例子中的格式字符串为什么看起来那么可怕,但它通常看起来更加温和,因为在大多数可读字符串中,你只需要在几个地方使用格式化字符。
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
现在没有理由不进行插值了。