Подтвердить что ты не робот

Есть ли систематический способ узнать, какие неявные defs находятся в сфере видимости, и какой из них связан в определенной точке?

Часто нет необходимости уделять внимание неявным аргументам в Scala, но иногда очень полезно понять, как компилятор автоматически предоставляет их. К сожалению, это понимание, похоже, трудно получить!

Есть ли общий метод для обнаружения того, как был предоставлен неявный параметр в данном фрагменте кода?

В идеале, интеграция IDE в один прекрасный день обеспечит эту информацию каким-то образом, но я ожидаю, что сейчас мне придется копать глубже. Есть ли способ попросить компилятор объяснить, какое именно неявное определение он выбирает в любой точке? Может ли это быть расшифровано косвенно из другого выхода компилятора?

В качестве примера я хотел бы узнать, как работать самостоятельно, где приходит аргумент implicit bf: CanBuildFrom[Repr, B, That] в TraversableLike.map, без чтения таких вопросов, как этот Переполнение стека!

4b9b3361

Ответ 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.