Predef.readLine 行为
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 = ""
这里造成差异的原因是什么? (我也尝试编译它,所以它不是 REPL 的东西。)
Scala 版本 2.9.0-1
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 = ""
What's the reason for the difference here? (I tried it compiled as well, so it's not a REPL thing.)
Scala version 2.9.0-1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这似乎是
Predef
中的一个错误:当我认为应该是:
您使用的第一个版本正在调用
Prefef.readLine
。由于缺少_*
类型描述,因此使用args
作为的重复参数
。args
的单个第一个参数来调用该函数Console.readLine在 uncurry 编译阶段,这个单个参数被包装到
WrappedArray
中,以便可以将其视为Seq[Any]
。然后使用toString
方法转换WrappedArray
,这就是"hello %s%n" 中的
。我认为这就是发生的事情。%s
使用的方法在第二个版本中,
args
从一开始就被视为Seq[Any]
,并且不会发生任何转换。整个事情有点有趣,因为一般来说编译器不会让你这样做:
使用
Any
,你就过了打字阶段。It seems like a bug in
Predef
:When I think it should be:
The first version you use is calling
Prefef.readLine
. Because of the missing_*
type ascription, the function is called withargs
as the single first argument of the repeated argumentargs
ofConsole.readLine
.In the uncurry compilation phase, this single argument is wrapped into a
WrappedArray
so that it it can be treated as aSeq[Any]
. TheWrappedArray
is then converted using thetoString
method and this is what is used for%s
in"hello %s%n"
. I think that is what happens.In the second version
args
is treated from the start as aSeq[Any]
and no conversion happens.The whole thing is a bit funny, because in general the compiler does not let you do this:
With
Any
, you get past the typer phase.