Есть ли систематический способ узнать, какие неявные defs находятся в сфере видимости, и какой из них связан в определенной точке?
Часто нет необходимости уделять внимание неявным аргументам в Scala, но иногда очень полезно понять, как компилятор автоматически предоставляет их. К сожалению, это понимание, похоже, трудно получить!
Есть ли общий метод для обнаружения того, как был предоставлен неявный параметр в данном фрагменте кода?
В идеале, интеграция IDE в один прекрасный день обеспечит эту информацию каким-то образом, но я ожидаю, что сейчас мне придется копать глубже. Есть ли способ попросить компилятор объяснить, какое именно неявное определение он выбирает в любой точке? Может ли это быть расшифровано косвенно из другого выхода компилятора?
В качестве примера я хотел бы узнать, как работать самостоятельно, где приходит аргумент implicit bf: CanBuildFrom[Repr, B, That]
в TraversableLike.map
, без чтения таких вопросов, как этот Переполнение стека!
Ответы
Ответ 1
- Добавьте опцию
-Xprint:typer
в командную строку scalac. Это печатает дерево программ сразу после фазы компилятора. Это лучше всего работает с коротким, самодостаточным примером. Вы также можете передать это скаляру. Это действительно огромный шаг к самообеспечению в Scala!
- Как уже упоминалось Рэндалл, IntelliJ показывает область видимости и выбранный Implicit View с
CTRL-ALT-SHIFT-I
. Подождите месяц или два, и неявные аргументы, вероятно, будут иметь аналогичную поддержку.
Ответ 2
В идеале, интеграция IDE в один прекрасный день предоставит эту информацию каким-то образом,...
Этот день сегодня в ИДЕЯ JetBrains. Если вы используете последнюю версию EAP версии IDEA 9 (9.0.3 EA # 95.289) с недавней ночной версией плагина Scala, эта возможность присутствует. Каждое выражение значения может быть выбрано и выдается команда, которая отображает всплывающее окно с указанием всех применимых неявных преобразований с тем, которое будет выделено компилятором.
И поскольку, по-видимому, есть несколько тех, кто еще этого не знает, есть бесплатный и открытый исходный код Community Edition IDEA, и он поддерживает плагин Scala.