Документация по функциям карты 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
Например, есть неявное преобразование, которое происходит для того, чтобы это работало.