私が正しく理解していれば、JVMの下で、ラムダ式を使うたびにオブジェクトを作成しなければなりません。ScalaのFunctionN型がAnyValではなくAnyRefのサブタイプとして作成されるのはなぜですか?
なぜオーバーヘッドですか? Functional型を設計するとき、AnyValの代わりにAnyRefを拡張することをScalaの作成者が選択したのはなぜですか?つまり、関数自体が、実際の '値'を持っていないので、関数が基本的なUnit表現(または等価チェックなどのためにハッシュを含むlong)を持つ値オブジェクトになることはできませんか?ラムダごとにオブジェクトを割り当てると、コードベースのパフォーマンスが向上するとは思いません。
AnyValを拡張することが私の頭に浮かぶ1つの明らかな欠点は、関数型のサブクラス化を禁止することです。おそらくそれだけでAnyValを拡張しないのに十分でしょうが、それ以外の理由はありますか?
--edit
ので削除(私は関数が他の変数の上にクローズする必要があることを理解し、私は適用方法、ないFunctionNオブジェクトのフィールドメンバへの引数として、それをモデル化するために、より自然なことだと思いますこの部分にjava.lang.Objectを持つ必要があります)。結局のところ、コンパイル時に知られているすべての変数が閉じているわけではありません。
- もう一度編集
私はそれについて知りました。私が気にしていたのは「ラムダ持ち上げ」でした。メソッドを呼び出す
関数には「真の値」があります。 –