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
这似乎是一个错误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作为重复参数的单一第一个参数args的Console.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,你就越过了这个阶段.
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |