2011-04-12 158 views
2

PSSQ代表可能愚蠢的问题斯卡拉:)斯卡拉阵列地图功能的文档(PSSQ#1)

结识斯卡拉一点点,在强制性的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文档中显而易见的东西?

+3

不要为''使用那种风格的标识。把它放在宣言的同一行,不管你做什么。你可能不喜欢它的外观,但它会为你节省麻烦。 – 2011-04-12 18:51:13

回答

3

这是因为Scala的一个关键特性叫做隐式转换。有大量的关于他们在网络上的文件,例如看到这一个:http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6

即将到来的Scala 2.9 REPL可以帮助你找出哪些可能是这里涉及到:

scala> :implicits -v 

...寻找我们发现有几个数组转到mutable.ArrayOps。对于一个scaladoc:http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/mutable/ArrayOps.html

这意味着,自隐式转换方法refArrayOps在范围(在默认Predef),当您尝试调用一个方法上没有针对ArrayArrayOps定义的Array, scala会插入(隐含地)转换,因此你实际上已经有了

Predef.refArrayOps(args).map(...) 
+0

伟大的联动!谢谢 :) – tmbrggmn 2011-04-12 18:51:51

1

简单的回答:map实际上是一个Traversable性状的方法,其中包括Array

硬答案:Array并没有真正延伸Traversable了(IIRC),但是当Traversable方法被称为上Array例如,有这种情况发生,以允许工作的隐式转换。