Predef.readLine行为

Lui*_*hys 4 console scala

scala> val input = readLine("hello %s%n", "world")
hello WrappedArray(world)
input: String = ""

scala> val input = Console.readLine("hello %s%n", "world")
hello world
input: String = ""
Run Code Online (Sandbox Code Playgroud)

这有什么区别的原因是什么?(我也尝试过编译,所以它不是REPL的东西.)

Scala版本2.9.0-1

huy*_*hjl 5

这似乎是一个错误Predef:

def readLine(text: String, args: Any*) = Console.readLine(text, args)
Run Code Online (Sandbox Code Playgroud)

当我认为它应该是:

def readLine(text: String, args: Any*) = Console.readLine(text, args: _*)
Run Code Online (Sandbox Code Playgroud)

您使用的第一个版本是调用Prefef.readLine.因为丢失的_*类型归属,该函数被调用,args作为重复参数的单一第一个参数argsConsole.readLine.

uncurry编译阶段,这个单个参数被包装成一个,WrappedArray以便它可以被视为一个Seq[Any].所述WrappedArray然后使用转换toString方法,这就是被用于%s"hello %s%n".我想这就是发生的事情.

在第二个版本args中从一开始就被视为a Seq[Any]并且没有转换发生.

整个事情有点搞笑,因为通常编译器不允许你这样做:

scala> def f(s: Int*) = s foreach println
f: (s: Int*)Unit

scala> def g(s: Int*) = f(s)
<console>:8: error: type mismatch;
 found   : Int*
 required: Int
       def g(s: Int*) = f(s)
Run Code Online (Sandbox Code Playgroud)

有了Any,你就越过了这个阶段.