Документация по функциям карты Scala Array (PSSQ #1)

PSSQ расшифровывается как возможно глупый вопрос Scala :)

Немного знакомимся со Scala, и в обязательном примере Hello World (код ниже) аргументы функции main представляют собой массив строк.

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

В примере я использую функцию map() для массива. Однако, когда я проверяю документацию по API Scala, map() не указана в списке функций, доступных для Array. Происходит ли какое-то волшебство, или я упустил что-то очевидное в документации по API?


person tmbrggmn    schedule 12.04.2011    source источник
comment
Не используйте этот стиль идентификации для {. Поместите его в ту же строку декларации, что бы вы ни делали. Вам может не понравиться, как это выглядит, но это избавит вас от проблем.   -  person Daniel C. Sobral    schedule 12.04.2011


Ответы (2)


Это связано с одной ключевой особенностью Scala, называемой неявными преобразованиями. В сети есть много документов о них, например, вот этот: http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6

Предстоящий Scala 2.9 REPL может помочь вам узнать, что здесь может быть задействовано:

scala> :implicits -v

... ища Array находим несколько таких, которые идут в mutable.ArrayOps. Скаладок для этого: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/mutable/ArrayOps.html

Это означает, что, поскольку метод неявного преобразования refArrayOps находится в области видимости (по умолчанию Predef), всякий раз, когда вы пытаетесь вызвать метод для Array, который не определен для Array, но для ArrayOps, scala будет вставлять (неявно) преобразование, поэтому вы на самом деле есть

Predef.refArrayOps(args).map(...)
person 0__    schedule 12.04.2011

Простой ответ: map на самом деле является методом черты Traversable, которая включается в Array.

Жесткий ответ: Array на самом деле больше не расширяет Traversable (iirc), но когда методы Traversable вызываются для экземпляра Array, происходит неявное преобразование, которое позволяет этому работать.

person Jonathan Sterling    schedule 12.04.2011