可変長引数の取り扱い
単純に
scala> def sprintf(fmt:String, args:Any*) = String.format(fmt, args) sprintf: (String,Any*)java.lang.String
だと
scala> sprintf("%d,%d", 1,2) java.util.IllegalFormatConversionException: d != scala.runtime.BoxedObjectArray at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:3992) at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2708) at java.util.Formatter$FormatSpecifier.print(Formatter.java:2660) at java.util.Formatter.format(Formatter.java:2432) at java.util.Formatter.format(Formatt...||<
のように「型が違うと」怒られるので
ちょっと前までは、
def sprintf(fmt:String, args:Any*):String = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)
とすればよかったが、
いつの間にか、
scala> def sprintf(fmt:String, args:Any*) = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray) <console>:4: warning: I'm seeing an array passed into a Java vararg. I assume that the elements of this array should be passed as individual arguments to the vararg. Therefore I follow the array with a `: _*', to mark it as a vararg argument. If that's not what you want, compile this file with option -Xno-varargs-conversion. def sprintf(fmt:String, args:Any*) = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)
(コンパイルは通るけど、)とかいわれるようになったので、
素直に
def sprintf(fmt:String, args:Any*):String = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]): _*)
とすると、警告は出なくなる。
「: _*」については、勉強中・・・