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

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?

2 ответа

Решение

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

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

scala> :implicits -v

... в поисках массива мы находим несколько 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(...)

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

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

Другие вопросы по тегам