2

PSSQ 代表可能是愚蠢的 Scala 问题:)

稍微了解一下 Scala,在强制性的 Hello World 示例(下面的代码)中,主函数的参数是一个字符串数组。

object HelloWorld
{
    def main(args: Array[String]): Unit = 
    {
        args.map((arg:String) => arg.toUpperCase());
        printf("%s %s!", "Hello", "World");
    }
}

在示例中,我map()在数组上使用该函数。但是,当我查看 Scala API 文档时,map()并未将其列为可用于Array. 是否发生了某种魔术,或者我在 API 文档中遗漏了一些明显的东西?

4

2 回答 2

3

这是因为 Scala 的一个关键特性称为隐式转换。网上有很多关于它们的文件,例如看这个: http: //www.codecommit.com/blog/scala/scala-for-java-refugees-part-6

即将推出的 Scala 2.9 REPL 可以帮助您找出其中可能涉及的内容:

scala> :implicits -v

...寻找 Array 我们找到了几个去mutable.ArrayOps. 那个的scaladoc:http ://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/mutable/ArrayOps.html

这意味着由于隐式转换方法refArrayOps在范围内(在 default 中),每当您尝试在未定义为but forPredef的方法上调用方法时,scala 将插入(隐式)转换,因此您实际上有ArrayArrayArrayOps

Predef.refArrayOps(args).map(...)
于 2011-04-12T18:38:40.380 回答
1

简单的答案:map实际上是Traversabletrait 上的一个方法,它包含在Array.

艰难的答案:Array不再真正扩展Traversable(iirc),但是当Traversable在实例上调用方法时Array,会发生隐式转换以使其工作。

于 2011-04-12T18:32:50.140 回答