Есть ли систематический способ узнать, какие неявные определения находятся в области действия, а какие связаны в определенной точке? - PullRequest
21 голосов
/ 05 июля 2010

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 05 июля 2010
  1. Добавьте параметр -Xprint:typer в командную строку scalac.Это печатает дерево программ сразу после фазы компилятора typer.Это лучше всего работает с коротким, самостоятельным примером.Вы также можете передать это скалаку.Это действительно огромный шаг к самостоятельности в Scala!
  2. Как уже упоминал Рэндалл, IntelliJ отображает область действия и выбранный неявный вид с CTRL-ALT-SHIFT-I.Подождите месяц или два, и неявные аргументы, вероятно, получат аналогичную поддержку.
7 голосов
/ 05 июля 2010

В идеале, однажды интеграция с IDE каким-то образом предоставит эту информацию, ...

Этот день сегодня с ИДЕИ JetBrains. Если вы используете последнюю версию EAP IDEA версии 9 (9.0.3 EA # 95.289) с недавним ночным выпуском плагина Scala, эта возможность присутствует. Можно выбрать любое выражение значения и выдать команду, которая отображает всплывающее окно, показывающее все применимые неявные преобразования, причем выделенное компилятором будет выделено.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...