読者です 読者をやめる 読者になる 読者になる

class内のメソッドだと末尾再帰最適化してくれない?(objectのメソッドだとOK)

scala

コップ本をざっと読むと素直に末尾再帰呼び出ししていれば最適化してくれるという記載があって、また、Web上の情報を見るとできそうな雰囲気なんだけども、手元で試したらちょっと意外な挙動があった(2.9.1)。

class内に末尾再帰呼び出しをするメソッドを作ると、末尾再帰最適化をしてくれない(invokevirtualで当該メソッドを再帰呼び出ししている)。でも、object内に同じものを作ると末尾再帰最適化をしてくれる(gotoになってる)。

ちゃんとScalaの言語仕様を見ていないので、実はよく知られた挙動なのかもしれないけれど(識者の方のご指摘歓迎)、個人的にはまりやすそうな動きなので気をつけておきたいなぁと。