Лучший подход к чтению кода Scala DSL? - PullRequest
3 голосов
/ 20 января 2011

На Squeryl страница начала работы есть пример кода Scala:

import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) {

   val squeryl = "org.squeryl" % "squeryl_2.8.1" % "0.9.4-RC3"
}

Я озадачен, потому что% не является методом, определенным в классах RichString или String.Мое лучшее предположение состоит в том, что он определен где-то еще и называется неявным преобразованием.

Как лучше всего читать и понимать такой код в Scala?

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Это может быть только от import sbt._ или от DefaultProject.Поскольку sbt не является объектом пакета, он должен поступать из DefaultProject.

Это связано с тем, что имплициты должны быть определены или импортированы в область действия, и вы можете импортировать их только изобъекты (либо object объекты, либо экземпляры классов).Исключение составляет implicits, определенное на компаньон объекты источника или назначение (при известном) типа, ни один из которых применяются, как вы уже проверили.

1011 * Это немного спорный вопрос, хотя.Причина, по которой был создан новый Scaladoc, заключается именно в том, чтобы решить такие проблемы.

Возьмем, к примеру, анализатор Scala:

import scala.util.parsing.combinator.JavaTokenParsers
object T extends JavaTokenParsers {
    def myparser = "\\w+".r ~ "\\d+".r
}

Метод ~ не определен в Regex, поэтому мы ищем это.Проверьте последнюю версию scaladoc здесь , чтобы попробовать приведенное ниже объяснение.

Самый простой способ: нажмите # в верхнем левом углу, чтобы получить список методов, начинающихся с символа.Прокрутите вниз до ~ и посмотрите: парсеры BigInt OnceParser.С этого момента используйте метод проб, ошибок и интуиции.

Методическим путем: введите JavaTokenParsers в поле поиска, чтобы быстро найти класс, а затем выберите его.В списке методов найдите implicit из Regex в другом месте.Есть только один, который принимает до Parser.Нажмите Parser для подтверждения.

Вы можете нажать implicit def regex, метод, выполняющий преобразование, чтобы увидеть, где он определен: RegexParsers.Документы к JavaTokenParsers показывают определение этого метода, даже если оно не определено или переопределено в этом классе.

Это имеет особое значение, поскольку при проверке Документация SBT API на DefaultProject, вы наткнетесь на тот факт, что он сам не определяет методы и предоставляет только имя методов для своих 40 (если я это правильно счел) черт и предков предков.Может потребоваться некоторое время, пока вы не нажмете ManagedProject, чтобы обнаружить, что оно имеет неявные преобразования из String в GroupID и RepositoryName, причем первый определяет % и %%, а последний определяет at.

3 голосов
/ 20 января 2011

Плагин IntelliJ Scala обычно может найти их для вас, поэтому вы можете использовать ^ b, чтобы перейти прямо к нему.Кроме того, это поиск по документации, начиная с того, что вы импортировали.

1 голос
/ 20 января 2011

Это неявное преобразование, хорошо!

Как и во всех других случаях, если это не предопределено в базовой библиотеке, то лучше всего начать поиск с импорта и суперкласса.

В данном примере это довольно очевидно что-то из SBT, так что вы можете найти его с помощью быстрого поиска по коду Google

...