Ответ 1
Во-первых, вам нужно помнить, что Scalac будет только пытаться встроить вещи, когда вы компилируете с помощью -optimise
(или -Yinline
, я думаю).
Рассмотрим следующий простой случай:
class Meep {
@inline def f(x: Int) = x + 19
}
object Main extends App {
new Meep().f(23)
}
Если я скомпилирую это с помощью -optimise
, Scalac даст мне предупреждение: there were 1 inliner warnings; re-run with -Yinline-warnings for details
. Теперь, помимо хихиканья грамматики, это не дало мне многого.
Итак, перекомпилируйте с помощью -Yinline-warnings
. Теперь я получаю: At the end of the day, could not inline @inline-marked method f
. Ну, хорошо, это тоже не очень полезно, но я предполагаю, что я получаю за использование частного флага компилятора.:) Некоторые из встроенных предупреждений немного более полезны, кстати - например: Could not inline required method f because bytecode unavailable.
(что происходит в REPL)
Помощник компилятора объясняет -Yinline-warnings
как Emit inlining warnings. (Normally surpressed due to high volume)
, поэтому я предполагаю, что он должен использоваться в каждом конкретном случае.
В любом случае, если мы изменим определение f
в приведенном выше фрагменте на @inline final def f(x: Int) = x + 19
, встроенное предупреждение исчезнет, и метод будет правильно вложен.
Надеюсь, что это помогло.