Глава 2 новой книги Мэннинга "Scala in Depth" Джоша Суреша опубликована здесь . Читая статью, я наткнулся на этот фрагмент кода:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
tmpArg.map(name => new java.io.File(name)).
filter(_.isDirectory).
getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")))
}
Следующий текст, объясняющий код выше, гласил:
Метод getTevenDirectory принимает параметр командной строки как
Опция, содержащая String и возвращающая ссылку на объект File
временный каталог, который мы должны использовать. Первое, что мы делаем, это используем
метод карты в Option для создания файла java.io.File, если был
параметр. Далее мы убедимся, что этот вновь созданный объект файла
это каталог. Для этого мы используем метод фильтра. Это проверит
соответствует ли значение в Option некоторому предикату и, если нет,
преобразовать в None. Наконец, мы проверяем, есть ли у нас значение в
Вариант; в противном случае мы возвращаем временный каталог по умолчанию.
Итак, для меня, пришедшего с Java и изучающего Scala, синтаксис кода смущает меня. Я не понимаю, как существует точка после вызова функции map (...). Похоже, что происходит так много выводов типов, я чего-то упускаю и не вижу типов.
Мне было бы очень полезно, изучая Scala, иметь возможность каким-то образом увидеть все предполагаемые типы, отменить (или отменить) все сокращения, то есть чрезмерно подробную версию, похожую на pre-Java 6, где типы должны быть явными по обе стороны от равных для классов коллекции.
Есть ли где-нибудь инструмент, который бы брал фрагмент кода Scala и делал явные разные вещи (возможно, в виде флагов; один для типов, другой для имплицитов, другой для фигурных скобок, другой для точек с запятой). Мне просто нужно что-то, чтобы перейти от полностью сжатого кода к чему-то более близкому к Java, чтобы я мог чувствовать себя уверенно, развивая свои навыки чтения (и в конечном итоге написания) более лаконичного Scala.
Вот то, что я ищу:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
ContainerType1[Type1] t1 = tmpArg.map(name => new java.io.File(name));
ContainerType2[Type2] t2 = t1.filter(_.isDirectory);
return t2.getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")));
}
Я специально не зациклен на вышеуказанном. Я просто не могу понять, как работают цепочечные вызовы с точки зрения того, что на самом деле происходит из-за вывода типа. Любая помощь по этому вопросу будет принята с благодарностью.