Документация по функциям карты Scala Array (PSSQ # 1) - PullRequest
2 голосов
/ 12 апреля 2011

PSSQ означает «Возможно, глупый вопрос о Скале» :)

Немного познакомимся с 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 ]

3 голосов
/ 12 апреля 2011

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

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

scala> :implicits -v

... в поисках массива мы находим несколько из них, которые идут на mutable.ArrayOps.Scaladoc для этого: http://www.scala -lang.org / архивы / загрузки / дистрибутив / файлы / nightly / документы / библиотека / scala / collection / mutable / ArrayOps.html

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

Predef.refArrayOps(args).map(...)
1 голос
/ 12 апреля 2011

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

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

...